我有一个使用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正在以这种方式解决以及如何解决它的任何提示?
答案 0 :(得分:2)
这是因为您已经在Namespace1
内,而没有使用其完全限定的类名(FQCN)。引用Class2
指的是不存在的类Namespace2\Class2
。
您可以通过两种简单的修改来解决此问题:
\Namespace1\Namespace2\Class2
(前面的反斜杠)。new \Namespace2\Class2()
导入类,这样您就可以简单地说use Namespace\Class2 as Class2
来引用该类。请注意,在第二种情况下,您没有前导反斜杠,因为new Class2()
需要提供要导入的类的FQCN,因此隐含反斜杠。