带有命名空间的PHP __autoload()

时间:2014-01-18 04:33:09

标签: php autoload spl-autoload-register

spl_autoload_register('Think\Think::autoload');

在名称空间Think \我创建了上面的注册函数,当我尝试使用类似Storeage类没有包含的类时,php会将Storeage作为变量传递给函数Think \ Think :: autoload,但实际上将Think \ Storeage作为变量传递,为什么它将额外的Think \添加到自动加载而不仅仅是Storeage?

这是否意味着自动加载只会搜索在创建自动加载功能的同一命名空间下声明的类?

2 个答案:

答案 0 :(得分:0)

自动加载功能通常可以根据需要为您提供文件。因此,例如,我在命名空间Spell中有一个名为Write的类,它位于write/spell.php中。所以我告诉我的自动加载功能如何查找文件(在这种情况下,我的目录镜像我的命名空间)。

自动加载功能本身并不关心命名空间本身。它关心的是找到包含您的类的文件并加载它们。因此,要回答您的问题,如果您编写执行此操作的函数,则自动加载仅限于命名空间。

现在,请注意你正在做的事情。您的自动加载功能已在命名空间中。这意味着您必须手动包含包含该类的文件,否则您的自动加载将失败。

答案 1 :(得分:0)

这是一个例子。

loader.php

namespace bigpaulie\loader;

class Loader {

    /**
    *   DIRECTORY_SEPARATOR constatnt is predefined in PHP
    *   and it's different for each OS
    *   Windows : \
    *   Linux : /
    */
    public static function load($namespace){
        $filename = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . ".php";
        if(file_exists($filename)){
            require_once $filename;
        }else{
            throw new \Exception("Error Processing Request", 1);
        }
    }

}

的index.php

require_once 'path/to/loader.php';

spl_autoload_register(__NAMESPACE__ . 'bigpaulie\loader\Loader::load');

$class1 = new \demos\Class1();

// or 

use bigpaulie\core\Class2;

$class2 = new Class2();

正如您所看到的,我们可以使用我们所需的任何命名空间来确保类文件的路径存在。

希望这有帮助!

祝你好运, 保罗。