假设我在相同的命名空间中有类:
目录:
(文件夹)a
- a.php只会
(文件夹)b
- b.php
- c.php
我们使用命名空间和__autoload
,如下所示:
在文件夹b\b.php
中:
<?php
namespace b;
use b as x;
function __autoload($clsName){
$clsName='../'.str_replace('\\', '/', $clsName).'.php';
require_once $clsName;
}
class b{
function __construct(){
print("b file<hr/>");
}
}
$t=new x\c(); // line 13
?>
并在文件夹b\c.php
中:
<?php
namespace b;
class c{
function __construct(){
print("c file<hr/>");
}
}
?>
当我们定义$t=new x\c
时,__autoload
不会调用!
请帮帮我:(
错误消息:
Fatal error: Class 'b\c' not found in C:\xampp\htdocs\project\TEST\b\b.php on line 13
答案 0 :(得分:2)
您尚未定义自动加载器。 PHP查找__autoload
(或\__autoload
- 在全局命名空间中定义的函数),而您只定义了\b\__autoload
(是的,函数被命名为!)
如何修复它:在命名空间外移动__autoload
声明
更好的解决方法:您应该使用spl_autoload_register
答案 1 :(得分:0)
很难确切地看出出了什么问题。通过错误的外观,似乎没有调用__autoload()
函数。如果是这样的话,我会期望require_once
语句失败并显示错误,说明找不到文件,或类似的事情。
您可以尝试在__autoload()
函数中添加一些调试语句,以查看正在发生的事情,包括var_dump
变量的$clsName
。
值得注意的是PHP manual regarding autoloading中显示的以下消息:
spl_autoload_register()提供了更灵活的替代方案 自动加载类。出于这个原因,使用__autoload()是 气馁,将来可能会被弃用或删除。
您还应该注意,PHP自动加载有一个“标准”,称为PSR-0。这是一个link to an article,可以很好地解释它。
在上面提到的article和PSR-0 document中,您都可以使用示例自动加载器。我建议使用其中一个而不是尝试实现自己的。