PSR-4自动加载器故障:无法找到Foo\Bar\Qux\Quux类
排查PSR-4自动加载器类找不到的问题
我帮你排查了一下,你遇到的Class 'Foo\Bar\Qux\Quux' not found错误,核心问题出在文件路径的处理上,咱们一步步来修复:
1. 绝对路径导致文件找不到
你在index.php里给命名空间绑定的路径是'/src'和'/tests',这是系统根目录的绝对路径(比如对应Windows的C:\src),但你的src和tests目录明明在项目根目录(C:\xampp\htdocs\Home\foo-bar)下面,自动加载器自然找不到文件。
修复方法
用__DIR__获取当前index.php所在的目录(也就是项目根目录),然后拼接正确的子目录路径:
<?php // 获取项目根目录(index.php所在的目录) $rootDir = __DIR__ . DIRECTORY_SEPARATOR; $loader->addNamespace('Foo\Bar', $rootDir . 'src'); $loader->addNamespace('Foo\Bar', $rootDir . 'tests');
2. 大小写不一致的潜在问题
你的目录是example(全小写),但index.php里写的是require_once "Example/loader.php";。虽然Windows系统不区分文件大小写,但如果后续切换到Linux/Mac环境,这个问题会直接导致加载失败,建议统一大小写:
require_once "example/loader.php";
3. (可选)添加调试代码验证路径
如果还不确定问题,可以在loader.php的loadMappedFile方法里加一行调试代码,查看自动加载器实际尝试加载的文件路径:
protected function loadMappedFile($prefix, $relative_class) { if (isset($this->prefixes[$prefix]) === false) { return false; } foreach ($this->prefixes[$prefix] as $base_dir) { $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; // 调试输出:查看实际要加载的文件路径 echo "尝试加载文件:" . $file . "<br>"; if ($this->requireFile($file)) { return $file; } } return false; }
修复后的完整index.php示例
<?php require_once "example/loader.php"; $loader = new \Example\Psr4AutoloaderClass; $loader->register(); // 获取项目根目录 $rootDir = __DIR__ . DIRECTORY_SEPARATOR; $loader->addNamespace('Foo\Bar', $rootDir . 'src'); $loader->addNamespace('Foo\Bar', $rootDir . 'tests'); new \Foo\Bar\Qux\Quux;
另外确认一下:你的src/Qux/Quux.php文件里的命名空间namespace Foo\Bar\Qux;是正确的,这部分没问题。
按照上面的修改后,自动加载器就能正确找到Foo\Bar\Qux\Quux类了。
内容的提问来源于stack exchange,提问作者Danny St.
相关产品推荐
相关产品推荐

