1

假设我在相同的命名空间中有类:

目录 :

  • (文件夹)一个

    • 一个.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
4

2 回答 2

2

您还没有定义自动加载器。PHP 查找__autoload(或\__autoload- 在全局命名空间中定义的函数),而您只定义了\b\__autoload(是的,函数被命名为!)

如何解决:将__autoload声明移到命名空间之外

更好的解决方法:你应该使用spl_autoload_register

于 2012-11-27T23:22:49.117 回答
0

很难确切地看到出了什么问题。从错误的外观来看,似乎__autoload()没有调用该函数。如果是这样,我希望该require_once语句会失败,并显示找不到文件或类似的错误。

你可以尝试在你的函数中加入一些调试语句__autoload()来看看发生了什么,包括var_dump你的$clsName变量。

可能值得注意的是PHP 手册中出现的有关自动加载的以下消息:

spl_autoload_register()为自动加载类提供了更灵活的替代方案。出于这个原因,不鼓励使用__autoload()并且将来可能会弃用或删除。

您还应该注意,PHP 自动加载有一个“标准”,称为PSR-0。这是一篇文章的链接,它给出了很好的解释。

在上面提到的文章PSR-0 文档中,都是您可以使用的示例自动加载器。我建议使用其中之一,而不是尝试实现自己的。

于 2012-11-27T23:01:08.457 回答