“Class not found”本质是PHP自动加载未触发,需先确保class_exists()返回true:严格校验PSR-4命名空间与路径大小写、执行composer dump-autoload -o、验证文件存在性/语法/权限,再进行依赖注入。

“Class not found”不是代码写错了,是自动加载根本没触发——先让类能被 class_exists() 认出来,再谈注入和调用。
确认命名空间与文件路径是否完全匹配
PHP 自动加载(PSR-4)对大小写、斜杠、层级极其敏感,Linux 服务器上错一个字母就加载失败:
- 报错类名如
AppModelsUser,对应文件必须是app/Models/User.php(注意Models首字母大写,不是models) - 文件顶部
namespace必须严格为namespace AppModels;(末尾分号、反斜杠、大小写缺一不可) - 类定义必须是
class User,不能是class user或class UserModel - Windows 下开发后传到 Linux 服务器,需检查 Git 是否保留了大小写(
git config core.ignorecase false)
验证 Composer 自动加载是否生效
即使路径和命名空间都对,autoload 映射没更新也会白忙活:
- 检查
composer.json中"psr-4": { "App\": "app/" }—— 注意双反斜杠和结尾斜杠 - 终端进入项目根目录,执行
composer dump-autoload -o(加-o强制生成优化映射) - 立刻验证:
php -a→ 输入var_dump(class_exists('App\Models\User'));,返回bool(true)才算通过 - 如果返回
false,说明 autoload 没认出这个类,别急着改控制器或路由,先解决这一步
排查文件存在性、语法与权限问题
类文件“看着在”,其实可能被忽略、损坏或不可读:
立即学习“PHP免费学习笔记(深入)”;
- 用
ls -l app/Models/User.php确认文件真实存在,且不是空文件或 BOM 头污染(尤其 Windows 编辑保存时) - 执行
php -l app/Models/User.php检查语法错误——哪怕一个分号缺失,也会导致类注册失败 - Web 服务器用户(如
www-data)必须有读取权限:chmod 644 app/Models/User.php - 检查该文件是否被
.gitignore或部署脚本排除,导致线上缺失
ThinkPHP 8.0 特别注意:容器注入前必须确保类可解析
TP8 的依赖注入不会帮你“猜”类在哪,它只按 autoload 结果和 provider 绑定来 resolve:
- 控制器方法参数写
UserService $service报错?先运行var_dump(class_exists('app\service\UserService')); - 若返回
false,provider.php 里写再多'appserviceUserService' => ...都无效 - 子应用(如
app/admin)下的类,需单独在app/admin/provider.php中声明 autoload 或显式 bind - 构造函数里依赖的其他类(如
UserService依赖UserRepository),每个环节都得能class_exists()成功
最常被跳过的动作是:没跑 composer dump-autoload -o 就直接测注入,或者只在 IDE 里看路径没错,却没进命令行实测 class_exists()。类找不到的本质,永远是 PHP 运行时找不到那个文件,而不是框架“不支持”你写的类名。



















