spl_autoload_register和$ class变量的属性

时间:2014-05-05 10:33:10

标签: php

我有一个使用Namespace1的类,以及一个使用Namespace2的类。示例代码如下所示:

namespace Namespace1

class 1
 {
  //somewhere in here we call new Namespace2\Class2();
 }

这是我在启动时调用的一个非常基本的自动加载器方法(它不是生产就绪代码):

public function LoadAutoRegister()
{
  spl_autoload_register(function($class){
    $newClass = str_replace('\\', DIRECTORY_SEPARATOR, $class);
    $basePath = realpath(__DIR__) . DIRECTORY_SEPARATOR;
    $file = $basePath.$newClass.".php";

    include $file;
  });
}

的index.php

<?php

 //require autoloader class and call the register method above
 $foo = new Namespace1\Class1();
 $foo-> //Call a method that forces the auto register to search for Class2.php
?>

此代码正常工作,直到我到达强制堆栈加载 Namespace2 \ Class2.php 的行。我已经检查了 spl_autoload_register 中的 $ class 变量,它实际上是在传递 Namespace1 \ Namespace2 \ Class2 。嗯,那不好,因为文件不在那里(我在我的目录结构中建模我的命名空间)。

关于为什么$ class正在以这种方式解决以及如何解决它的任何提示?

1 个答案:

答案 0 :(得分:2)

这是因为您已经在Namespace1内,而没有使用其完全限定的类名(FQCN)。引用Class2指的是不存在的类Namespace2\Class2

您可以通过两种简单的修改来解决此问题:

  1. 实例化时使用FQCN:\Namespace1\Namespace2\Class2(前面的反斜杠)。
  2. 在命名空间声明后立即使用new \Namespace2\Class2()导入类,这样您就可以简单地说use Namespace\Class2 as Class2来引用该类。
  3. 请注意,在第二种情况下,您没有前导反斜杠,因为new Class2()需要提供要导入的类的FQCN,因此隐含反斜杠。