带有命名空间的PHP _autoload()

带有命名空间的PHP _autoload(),php,autoload,spl-autoload-register,Php,Autoload,Spl Autoload Register,在namespace Think\下,我创建了上面的register函数,当我尝试使用未包含的类(如类Storeage)时,php会意外地将Storeage作为变量传递给函数Think\Think::autoload,但实际上它将Think\Storeage作为变量传递给autoload,为什么它会将额外的Think\添加到autoload而不仅仅是Storeage 这是否意味着自动加载将只搜索在创建自动加载函数的同一命名空间下声明的类?自动加载函数通常通过按需包含文件来工作。例如,我在命名空间

在namespace Think\下,我创建了上面的register函数,当我尝试使用未包含的类(如类Storeage)时,php会意外地将Storeage作为变量传递给函数Think\Think::autoload,但实际上它将Think\Storeage作为变量传递给autoload,为什么它会将额外的Think\添加到autoload而不仅仅是Storeage


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

自动加载函数通常通过按需包含文件来工作。例如,我在命名空间
Write
中有一个名为
Spell
的类,它位于
Write/Spell.php
中。因此,我告诉我的自动加载函数如何查找文件(在本例中,我的目录镜像了我的名称空间)

自动加载函数本身并不关心名称空间本身。它关心的是找到包含类的文件并加载它们。因此,为了回答您的问题,如果您编写函数来实现自动加载,那么自动加载只会将自身限制为一个名称空间


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

以下是一个示例

loader.php
spl_autoload_register('Think\Think::autoload');
index.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);
        }
    }

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