升级后Class not found是因PSR-4规则强化:5.1默认目录改为app/、命名空间必须严格为appcontroller、大小写/斜杠/空格敏感,需修正composer autoload并清空runtime。

升级后出现 Class not found 或 include(): Filename cannot be empty,基本是 PSR-4 自动加载规则变更 + 命名空间路径不匹配导致的,不是文件丢了,而是框架“找不到路标”了。
为什么 5.0.24 → 5.1.39 会突然报引入失败?
ThinkPHP 5.1 强化了 PSR-4 规范校验,且默认应用目录从 application/ 改为 app/(除非你显式配置过)。5.0 中允许的模糊命名空间(如 controllerIndex)在 5.1 中会被直接拒载;另外,5.1 的自动加载器对大小写、斜杠方向、末尾空格更敏感。
- 5.0 默认
application/controller/Index.php→ 命名空间可写applicationcontroller或appcontroller(兼容旧习惯) - 5.1 默认只认
app/controller/Index.php→ 命名空间必须严格为appcontroller,多一个空格、少一个反斜杠、Controller写成controller都会崩 -
composer.json中若仍保留"psr-4": {"application\": "application/"},Composer 就不会扫描app/目录
快速验证是否是命名空间/路径错位
打开报错堆栈里提示的文件(比如 app/controller/Index.php),检查三处:
- 文件真实路径是否为
app/controller/Index.php(不是application/,也不是App/Controller/) - 该文件顶部
namespace是否为appcontroller(注意:是反斜杠,不是正斜杠;app小写,controller小写) - 调用处的
use语句是否完全一致,例如use appcontrollerIndex;—— 不能漏掉app,也不能写成AppController
Linux 服务器上,Index.php 和 index.php 是两个文件,务必确认实际文件名大小写与代码中引用完全一致。
立即学习“PHP免费学习笔记(深入)”;
composer autoload 必须重刷且核对
5.1 不再兼容 5.0 的 autoload 配置,必须手动修正并重建映射:
- 打开
composer.json,确认"autoload"区块为:"autoload": { "psr-4": { "app\": "app/" } } - 删掉
vendor/composer/autoload_*.php文件(或整个vendor/composer/目录) - 执行
composer dump-autoload -o,强制重新生成映射 - 检查生成的
vendor/composer/autoload_psr4.php,搜索app\,确认值指向的是项目根目录下的app/路径(不是application/)
runtime 缓存不清理 = 白忙活
5.1 的类编译缓存会固化旧的命名空间解析结果。哪怕你改对了所有路径和命名空间,只要 runtime/ 没清,错误就还在。
- 必须删除整个
runtime/目录(不只是runtime/cache/) - 不要只删子目录,
rm -rf runtime/最稳妥 - 重启 PHP 进程(
php-fpm reload)或 Web 服务(nginx -s reload),确保新 autoload 映射被加载
特别注意:如果项目用了 .env,升级后也要检查 APP_NAMESPACE 是否还设为 application —— 5.1 默认忽略它,硬编码走 app,留着反而干扰判断。



















