我在我的脚本中使用 __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/