提问者:小点点

如何在我的 /Classes/文件夹中使用PSR-4自动加载?


我尝试了多个PSR-4加载器,但它们要么不工作,要么我无法从另一个文件夹访问类。

我当前的文件夹结构:

-班级

--Config.php

--会议。php

--前端(文件夹)

---登录。php

PSR-4自动装弹机:

我尝试使用PSR-4自动加载寄存器加载所有类。我稍微修改了我的文件夹结构。我给所有的类都设置了命名空间类,但是Frotend文件夹中的类有命名空间类\前端。

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;
    }
});

我不确定这是否与autoloader有关,但我还想从任何文件调用该类,无论该类位于何处。所以如果我有一个文件在

/前端/模板/登录页面。php

我希望能够调用类"类\前端\登录"。

这可能吗?我该怎么做?


共1个答案

匿名用户

主要有两种方法可以让它工作:第一种选择是使用绝对服务器路径(从 '/'), 开始,在自动加载函数中为您的类设置基本目录:

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所建议的那样,更好的解决方案是保持\uuuuu DIR\uuuu不变,以保持项目文件夹的相关内容。不同服务器上的部署之间的绝对路径很脆弱\uuuu DIR\uuuuu是指它所使用的文件的目录;在这种情况下,您可以在这里注册自动加载功能。从这个目录开始,您可以导航到classes base目录,例如$base\u dir=\uuu dir\uu.'//src/

不要忘记为类命名名称空间:

namespace Classes;

class Foo
{
    public function test()
    {
       echo 'Hurray';
    }
 }

然后使用如下类:

$foo = new Classes\Foo();
$foo->test();