spl_autoload_register('Think\Think::autoload');在命名空间Think下,我创建了上面的注册函数,当我尝试使用没有包含的类时,php会将Storeage作为变量传递给Think\Think::autoload函数,但它实际上将Think\Storeage作为变量传递,为什么它会将额外的Think\添加到autoload而不只是Storeage?
这是否意味着autoload将只搜索在创建autoload函数的同一名称空间下声明的类?
发布于 2014-01-18 12:42:41
自动加载功能通常通过按需为您包含文件来工作。例如,我在名称空间Write中有一个名为Spell的类,它在write/spell.php中。因此,我告诉autoload函数如何查找文件(在本例中,我的目录反映了我的命名空间)。
autoload函数本身并不关心名称空间本身。它关心的是找到包含您的类的文件并加载它们。因此,为了回答您的问题,如果您编写函数来执行此操作,您的autoload将仅将其自身限制为名称空间。
现在,这里有一个关于你所做的事情的警告。您的自动加载函数已在命名空间中。这意味着您必须手动包含包含该类的文件,否则自动加载将失败。
发布于 2015-05-29 02:14:07
这里有一个例子。
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();正如您所看到的,我们可以使用所需的任何名称空间,我们只需确保指向类文件的路径存在。
希望这能有所帮助!
最好的问候,保罗。
https://stackoverflow.com/questions/21200010
复制相似问题