首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__autoload检测及接口

__autoload检测及接口
EN

Stack Overflow用户
提问于 2011-08-25 18:01:42
回答 3查看 3.4K关注 0票数 3

我在脚本中使用__autoload来根据需要包括类。我的脚本使用类名中的提示来查找包含它的文件。如果它以模型结束,它在模型目录中,控制器在控制器目录中,等等。我开始实现接口,因此需要调整我的自动加载程序。

理想情况下,当创建对象时,自动加载程序将确定该对象的文件名(存储对象的位置),并包含该文件。然后,它将询问该类实现了哪些接口,然后自动包含这些文件。

有点像

代码语言:javascript
复制
function __autoload($classname){
    echo $classname;
    include ("classes/$classname.php");
    $interfaces = class_implements($classname,FALSE);
    foreach($interfaces as $name){
        if(!class_exists($name,FALSE)){
        include("interfaces/".$name."inter.php");
        }
    }
}

但当我这么做的时候我就会犯错误

不能在第11行的__autoload() (以前在W:\xampp\htdocs\test\auto.php:5中声明)在W:\xampp\htdocs\test\auto.php中重新声明

在__autoload()中不可能这样做吗?我是否应该继续依赖命名约定来区分对象的类型和存储位置?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-25 18:11:27

在定义实现的接口之前,您不能定义类,而且附加的任何未知接口也将触发autoload函数。这意味着在第3行中,当包含类时,它将再次触发autoload函数,接口为$classname。现在,当从第二个__autoload()-call返回时,它将再次尝试包含接口,这将因为“已经定义”而失败。

附加:反对使用__autoload()来反对使用spl_autoload_register()

票数 6
EN

Stack Overflow用户

发布于 2011-08-25 18:05:34

使用寄存器注册其他自动登录功能。您指定的autoload函数是一个回调函数。这意味着您可以传递一个方法或类方法。这样,就可以将额外的自动添加到不同的类中,而不必担心命名冲突。

编辑

不会是这样的。请看KingCrunch的聪明答案。

即使这样做有效,我还是建议你不要这么做。通过拥有一个自动加载功能,或者你使用的每个库或框架可能会有额外的自动加载功能,你可以保持简单明了的自动加载功能。添加额外的功能可能会使调试变得过于复杂。

票数 4
EN

Stack Overflow用户

发布于 2011-08-25 18:12:36

由于您已经依赖于类的命名约定,所以只需修改现有的__autoload来解析接口名称即可。如果您将所有接口命名为"I_something",这应该是一个简单的更改。

如果您不想依赖于命名约定,那么需要设置某种类和接口注册表。注册表可以像硬编码数组一样简单,如下所示:

代码语言:javascript
复制
function __autoload($classname) {
    $classlist=array('MyClass1','path/to/file/myclass1.php',
                          'MyClass2','path/to/file/foo.php',
...
                         );

    $interfacelist=array('MyInterface1','path/to/file/bar1.php',
                              'I_foo','path/to/file/bibble.php',
...
                         );
            $path=$classname;
            if(array_key_exists($classname,$classlist)) {
                $path=PATH_CLASSES.$classlist[$classname];
            } else if(array_key_exists($classname,$interfacelist)) {
                $path=PATH_INTERFACES.$interfacelist[$classname];
            }
            if(file_exists($path)) {
                require_once($path);
            } else {
                $e=new Exception("Problem with path: $path");
            }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7195054

复制
相关文章

相似问题

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