Class not found 错误是 PSR-4 自动加载失败所致,需严格校验路径、命名空间、composer.json 配置及环境四者一致性,差一个大小写或斜杠即触发报错。

控制器报 Class not found,不是类文件丢了,是 ThinkPHP 按 PSR-4 规则“找路”时迷路了——路径、命名空间、composer 配置、服务器环境四者只要有一处对不上,就会立刻崩。
检查命名空间和文件路径是否完全一致
ThinkPHP 6+ 要求命名空间与磁盘路径严格一一对应,大小写、斜杠、层级都不能差。
- 比如报错
appcontrollerIndexControllernot found,就打开app/controller/IndexController.php,确认第一行是namespace appcontroller;(注意反斜杠,不能写成app/controller/或AppController) - Linux 服务器区分大小写:
IndexController.php≠indexcontroller.php,Windows 下开发没问题,一上服务器就挂 - 类名必须与文件名完全一致:
class IndexController,不能是class indexcontroller或class Indexcontroller
确认 composer autoload 配置并刷新映射
框架靠 composer.json 里的 PSR-4 配置知道去哪找类,改了目录或命名空间后不刷新,它就永远不知道新位置。
- 打开
composer.json,检查"autoload": {"psr-4": {"app\": "app/"}}是否存在,注意双反斜杠和结尾斜杠都得有 - 如果控制器放在
extend/或自定义目录(如addon/),必须在psr-4里显式加一行映射,例如:"Addon\": "addon/src/" - 改完配置后,终端执行:
composer dump-autoload -o(-o表示优化模式,推荐加上)
排查空控制器或错误路由兜底干扰
有时你以为访问的是某个控制器,其实框架根本没走到那一步——可能被空控制器机制拦截,或路由规则提前终止了流程。
立即学习“PHP免费学习笔记(深入)”;
- 检查
app/config/app.php中是否设置了'empty_controller' => 'Error',且app/controller/ErrorController.php真实存在、命名空间为appcontroller、类名为ErrorController - 空控制器只对标准的「模块/控制器/操作」URL 生效,闭包路由、资源路由、显式绑定的路由不会触发它
- 多应用模式下,空控制器要放在对应应用目录里,比如
app/index/controller/ErrorController.php
别忽略 PHP 扩展和运行环境差异
有些报错看着像控制器问题,其实是底层扩展缺失,尤其部署到线上后突然出事。
- 比如用到
finfo类(常见于文件下载、类型检测),报Class 'finfo' not found,说明 PHP 的fileinfo扩展未启用 - 执行
php -i | grep fileinfo查看是否显示fileinfo support => enabled;若无,需在php.ini中添加extension=fileinfo.so并重启 PHP 服务 - 宝塔面板用户可在「软件管理 → PHP 设置 → 安装扩展」中一键开启



















