自制MVC框架报错:ReflectionException提示ErrorController类不存在
解决Fatal error: Uncaught ReflectionException: Class "App\Core\Controller\ErrorController" does not exist错误
你的自动加载器逻辑存在根本性问题——只提取了类名作为文件名,却没有根据命名空间的层级构建正确的文件路径。举个例子,App\Core\Controller\ErrorController对应的文件应该是App/Core/Controller/ErrorController.php,但你的代码直接执行require_once $file;,也就是只会在当前执行脚本的目录(index.php所在目录)下查找ErrorController.php,如果这个文件实际在子目录里,自然加载失败。
虽然其他控制器(比如IndexController)能正常工作,大概率是这些文件被其他逻辑提前加载过,或者测试时的目录结构刚好巧合,但自动加载器的路径处理逻辑本身是错误的。
修复步骤:
重构自动加载器的路径生成逻辑
将命名空间中的反斜杠替换为系统对应的目录分隔符,拼接出完整的文件路径,这样才能正确定位到对应目录下的类文件。修改后的代码如下:function autoload(string $object) { // 替换命名空间分隔符为系统目录分隔符,拼接完整文件路径 $filePath = str_replace('\\', DIRECTORY_SEPARATOR, $object) . '.php'; echo "namespace: $object -> file: $filePath"; // 先检查文件存在再加载,避免不必要的报错 if (file_exists($filePath)) { require_once $filePath; } } spl_autoload_register('autoload');验证生成的文件路径
修改后查看输出,应该显示类似namespace: App\Core\Controller\ErrorController -> file: App/Core/Controller/ErrorController.php的内容(Windows系统会显示App\Core\Controller\ErrorController.php),确认这个路径和你的实际文件结构完全匹配。排查文件大小写与权限
- 对于Linux/macOS系统,文件名是大小写敏感的,要确保
ErrorController.php的大小写和类名完全一致(不能写成errorcontroller.php或Errorcontroller.php)。 - 检查文件权限,确保PHP进程拥有读取该文件的权限(Linux/macOS下一般设置为
644即可)。
- 对于Linux/macOS系统,文件名是大小写敏感的,要确保
内容的提问来源于stack exchange,提问作者Teo76
相关产品推荐
相关产品推荐

