使用自动加载器“spl_autoload_register”时,我无法使用命名空间实例化类。如果不使用命名空间,或者简单地排除自动加载器,它可以很好地访问类方法。我故意省略了第一个类的命名空间以显示错误。所有文件都在同一文件夹中运行。
错误的潜在原因:
由于命名空间在没有自动加载器的情况下工作,我怀疑自动加载器从实例化中添加了命名空间路径的反斜杠。如果是这样,这可能是找不到该类的原因。
观察:
自动加载加载类没有错误。如果在实例化期间不使用命名空间路径,则可以访问类方法。如果包含没有自动加载的类,则可以使用命名空间实例化 Class_2。
如果我注释掉 Class_2 的实例化,那么我会得到以下没有错误的信息:
Hello from class 1
错误信息:
Hello from class 1PHP Fatal error: Uncaught Error: Class 'Area_2\Class_2' not found in Xxx/run.php:9
自动加载器:
spl_autoload_register(
function ($class_name) {
$directories = ['./'];
$extension = ".class.php";
foreach ( $directories as $dir) {
if (file_exists($dir . $class_name . $extension)) {
require_once($dir . $class_name . $extension);
return;
}
}
}
);
运行文件:
include 'autoloader.php';
$class_1 = new Class_1();
$class_1->print_1();
$class_2 = new \Area_2\Class_2(); // Error by using namespace.
$class_2->print_2();
Class_1:
class Class_1 {
public function print_1()
{
echo "Hello from class 1";
}
}
Class_2:
namespace Area_2;
class Class_2 {
public function print_2()
{
echo "Hello from class 2";
}
}
最佳答案
您的自动加载器为任何使用命名空间的类假设了一个基于目录的系统,即使它不是故意的。原因是命名空间分隔符与目录分隔符相同(或相似到系统会自动在两者之间进行转换)。
当你这样做时:file_exists($dir . $class_name . $extension)
使用类 Area_2\Class_2
, PHP 将其转换为 ./Area_2\Class_2.class.php
.
因此,您的代码需要文件夹。
关于php - 不能对自动加载器使用命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62025473/