繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM