[英]How to use the PSR-4 autoload in my /Classes/ folder?
我嘗試了多個PSR-4加載器,但它們要么不起作用,要么我無法從另一個文件夾訪問這些類。
我當前的文件夾結構:
- 課程
--Config.php
--Session.php
- 前端(文件夾)
---的login.php
PSR-4自動加載機:
我嘗試使用PSR-4自動加載寄存器加載所有類。 我稍微修改了一下我的文件夾結構。 我給了所有類命名空間Classes,但Frotend文件夾中的命名空間為Classes \\ Frontend。
spl_autoload_register(function ($class) {
// project-specific namespace prefix
$prefix = 'Classes\\';
// base directory for the namespace prefix
$base_dir = __DIR__ . '/Classes/';
// does the class use the namespace prefix?
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// no, move to the next registered autoloader
return;
}
// get the relative class name
$relative_class = substr($class, $len);
// replace the namespace prefix with the base directory, replace namespace
// separators with directory separators in the relative class name, append
// with .php
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// if the file exists, require it
if (file_exists($file)) {
require $file;
}
});
我不確定這是否與自動加載器有關,但我也想從任何位置調用該類。 所以,如果我有一個文件
/Frontend/templates/login-page.php
我希望能夠調用類“Classes \\ Frontend \\ Login”。
這有可能,我該怎么做?
主要有兩種方法可以使它工作:第一種方法是使用絕對服務器路徑(以'/'開頭),在自動加載功能中設置類的基本目錄:
spl_autoload_register(function ($class) {
$prefix = 'Classes\\';
$base_dir = '/var/www/html/my_project/src/'; // your classes folder
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
正如@Félix建議的那樣, 更好的解決方案是堅持使用__DIR__
常量來保持項目文件夾的相對性。 不同服務器上的部署之間的絕對路徑很脆弱。 __DIR__
指的是它所用文件的目錄; 在這種情況下,它是您注冊自動加載功能的地方。 從此目錄開始,您可以導航到類基目錄,例如$base_dir = __DIR__ . '/../../src/;
$base_dir = __DIR__ . '/../../src/;
不要忘記命名您的類:
namespace Classes;
class Foo
{
public function test()
{
echo 'Hurray';
}
}
然后使用這樣的類:
$foo = new Classes\Foo();
$foo->test();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.