如何在我的 /类/ 文件夹中使用 PSR-4 自动加载?
How to use the PSR-4 autoload in my /Classes/ folder?
我试过多个 PSR-4 加载程序,但它们要么不起作用,要么我无法从另一个文件夹访问 classes。
我当前的文件夹结构:
-Classes
--Config.php
--Session.php
--Frontend (folder)
---Login.php
PSR-4 自动装弹机:
我尝试使用 PSR-4 自动加载寄存器加载所有 classes。我将其稍微修改为我的文件夹结构。我已经为所有 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;
}
});
我不确定这是否与自动加载器有关,但我也想从任何文件中调用 class,无论它位于何处。所以如果我在
中有一个文件
/Frontend/templates/login-page.php
我希望能够调用 class“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/;
不要忘记为您的 类 命名空间:
namespace Classes;
class Foo
{
public function test()
{
echo 'Hurray';
}
}
然后像这样使用 类:
$foo = new Classes\Foo();
$foo->test();
我试过多个 PSR-4 加载程序,但它们要么不起作用,要么我无法从另一个文件夹访问 classes。
我当前的文件夹结构:
-Classes
--Config.php
--Session.php
--Frontend (folder)
---Login.php
PSR-4 自动装弹机:
我尝试使用 PSR-4 自动加载寄存器加载所有 classes。我将其稍微修改为我的文件夹结构。我已经为所有 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;
}
});
我不确定这是否与自动加载器有关,但我也想从任何文件中调用 class,无论它位于何处。所以如果我在
中有一个文件/Frontend/templates/login-page.php
我希望能够调用 class“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/;
不要忘记为您的 类 命名空间:
namespace Classes;
class Foo
{
public function test()
{
echo 'Hurray';
}
}
然后像这样使用 类:
$foo = new Classes\Foo();
$foo->test();