[英]autoload and namespace
假设我在相同的命名空间中有类:
目录 :
(文件夹)一个
- 一个.php
(文件夹) b
- b.php
- 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
您尚未定义自动加载器。 PHP 查找__autoload
(或\\__autoload
- 在全局命名空间中定义的函数),而您只定义了\\b\\__autoload
(是的,函数被命名为!)
如何修复:将__autoload
声明移到命名空间之外
更好的修复:您应该使用spl_autoload_register
很难看出到底出了什么问题。 从错误的外观来看,似乎没有调用__autoload()
函数。 如果是这样,我希望require_once
语句失败,并出现错误,提示未找到文件,或类似的错误。
您可以尝试在__autoload()
函数中放入一些调试语句来查看发生了什么,包括$clsName
变量的var_dump
。
可能值得注意的是PHP 手册中出现的有关自动加载的以下消息:
spl_autoload_register()为自动加载类提供了更灵活的替代方法。 出于这个原因,不鼓励使用__autoload()并且将来可能会被弃用或删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.