使用带有自动加载功能的名称空间


Using namespaces with autoloading

所以我有这一小段代码自动加载类。一切都很顺利,直到我添加名称空间。我得到它找不到类的错误。但是当我删除命名空间时,它又工作了。(当我直接包含wbp.Foo.php时,它也可以工作。)

autoloader.php

<?php
function autoloadLib($className){
    $filename = "lib/wbp." . $className . ".php";
    if(is_readable($filename)){
        require $filename;
    }
}
spl_autoload_register("autoloadLib");

index . php

<?php
include "autoloader.php";
use Foobar'Foo;
echo Foo::Bar();
lib/wbp.Foo.php

<?php
namespace Foobar;
class Foo {
    public static function Bar(){
        return "foobar";
    }
}

在自动加载中,$className变量包含命名空间。您需要将类移动到包含名称空间的文件/文件夹结构中,或者从类名中删除名称空间并仅基于类进行加载。我建议使用前者,因为名称空间的全部意义在于允许使用相同的名称定义两个不同的类。在磁盘上的同一空间中不可能有两个文件名相同的文件。重命名$className可以像重命名str_replace('''', '.', $className)一样简单,并将类重命名为wbp.NameSpace.ClassName.php

如果您从名称空间开始,您应该在http://www.php-fig.org/psr/psr-4/上简单地阅读PSR-4文档-也有自动加载器的示例。

PSR-4正在成为一个标准,所以最好的方法是这样做