php - __autoload 检测并包含接口(interface)

标签 php interface autoload implements

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

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

有点像

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

除非我这样做时出现错误

Cannot redeclare __autoload() (previously declared in W:\xampp\htdocs\test\auto.php:5) in W:\xampp\htdocs\test\auto.php on line 11

难道不能在 __autoload() 中执行此操作吗?我是否应该继续依靠命名约定来区分对象类型和它们的存储位置?

最佳答案

不能在定义实现的接口(interface)之前定义一个类,另外任何未知接口(interface)也会触发自动加载功能。这意味着在第 3 行中包含类时,它将触发自动加载函数再次,接口(interface)为$classname。现在,当从第二个 __autoload() 调用返回时,它将尝试再次包含接口(interface),但由于“已定义”而失败。

附加:不推荐使用 __autoload() 反对使用 spl_autoload_register()

关于php - __autoload 检测并包含接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195054/

相关文章:

php - 从 Android 应用程序向 PHP 发送请求并接收响应

java - 在 Java 中,将所有接口(interface)提取到一个单独的项目中的技术动机是什么?

PHP 自动加载 - 找到文件 - 类 fatal error

PHP/PDO : Prepared statements don't work when creating a table?

PHP - 在保持文件扩展名的同时压缩 txt 文件

php - 整理MYSQL数据

php - 实现接口(interface)和自动加载类

java - 为什么我们不能在 lambda 表达式中使用默认方法?

c# - 为什么具有 "where T : class"约束的 Generic<T> 方法接受接口(interface)

php - 如何使用自动加载 Codeigniter 显示查询计数(*)中的数据?