自动加载和命名空间

时间:2012-11-27 22:33:08

标签: php oop namespaces autoload

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

目录:

  
      
  • (文件夹)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

2 个答案:

答案 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,可以很好地解释它。

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