首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有名称空间的PHP __autoload()

带有名称空间的PHP __autoload()
EN

Stack Overflow用户
提问于 2014-01-18 12:33:09
回答 2查看 397关注 0票数 0
代码语言:javascript
复制
spl_autoload_register('Think\Think::autoload');

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

这是否意味着autoload将只搜索在创建autoload函数的同一名称空间下声明的类?

EN

回答 2

Stack Overflow用户

发布于 2014-01-18 12:42:41

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

autoload函数本身并不关心名称空间本身。它关心的是找到包含您的类的文件并加载它们。因此,为了回答您的问题,如果您编写函数来执行此操作,您的autoload将仅将其自身限制为名称空间。

现在,这里有一个关于你所做的事情的警告。您的自动加载函数已在命名空间中。这意味着您必须手动包含包含该类的文件,否则自动加载将失败。

票数 0
EN

Stack Overflow用户

发布于 2015-05-29 02:14:07

这里有一个例子。

loader.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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();

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

希望这能有所帮助!

最好的问候,保罗。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21200010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档