spl_autoload_register('Think\Think::autoload');
在命名空间 Think\ 下我创建了上面的注册函数,当我尝试使用像 Storeage 类这样尚未包含的类时,php 会假设将 Storeage 作为变量传递给函数 Think\Think::autoload,但它实际上是通过 Think\存储作为变量,为什么它会在自动加载中添加额外的 Think\ 而不仅仅是存储?
这是否意味着自动加载只会搜索在创建自动加载函数的同一命名空间下声明的类?
spl_autoload_register('Think\Think::autoload');
在命名空间 Think\ 下我创建了上面的注册函数,当我尝试使用像 Storeage 类这样尚未包含的类时,php 会假设将 Storeage 作为变量传递给函数 Think\Think::autoload,但它实际上是通过 Think\存储作为变量,为什么它会在自动加载中添加额外的 Think\ 而不仅仅是存储?
这是否意味着自动加载只会搜索在创建自动加载函数的同一命名空间下声明的类?
自动加载功能通常通过按需为您包含文件来工作。因此,例如,我有一个Spell
在命名空间中调用的类Write
,它位于write/spell.php
. 所以我告诉我的自动加载函数如何找到文件(在这种情况下,我的目录反映了我的命名空间)。
自动加载函数本身并不关心命名空间本身。它关心找到包含您的类的文件并加载它们。因此,为了回答您的问题,如果您编写函数来执行此操作,您的自动加载只会将自身限制在命名空间中。
现在,这是对您的操作方式的警告。您的自动加载功能已经在命名空间中。这意味着您必须手动包含包含该类的文件,否则您的自动加载将失败。
这是给你的一个例子。
加载器.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);
}
}
}
索引.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();
正如你所看到的,我们可以使用任何需要的命名空间,我们只需要确保类文件的路径存在。
希望这可以帮助!
最好的问候,保罗。