Class not found 错误主因是 autoloader 未加载或未识别类:首要确认 vendor/autoload.php 是否被正确引入;其次检查 PSR-4 命名空间、路径、大小写是否严格一致;再运行 composer dump-autoload -v 验证扫描结果;最后清理 autoload_*.php 缓存文件并重生成。

Class not found 不是 Composer 坏了,而是 autoloader 没“看见”你的类 —— 90% 的问题出在路径、命名空间、缓存三者之一,而不是代码本身写错了。
确认 vendor/autoload.php 真被引入了
很多报错根本不是自动加载配置问题,而是入口脚本压根没加载 autoloader。比如 CLI 脚本里漏了 require __DIR__ . '/vendor/autoload.php';,或者 Web 入口用错了相对路径(../vendor/autoload.php 在子目录下就失效)。
- 用
file_exists(__DIR__ . '/vendor/autoload.php')手动验证路径是否存在,别靠感觉 - 检查报错堆栈:如果连
vendor/autoload.php都没出现在 trace 里,基本就是这一步没做 - Web 环境下注意
$_SERVER['DOCUMENT_ROOT']和脚本实际位置可能不一致,建议用__DIR__或dirname(__FILE__)定位
运行 composer dump-autoload -v 看它到底扫了哪些路径
加 -v(verbose)不是为了好看,是唯一能看清 Composer 实际行为的方式。它会逐行输出扫描的目录、匹配到的类、跳过的文件,以及 PSR-4/classmap 是否生效。
- 如果输出里完全没出现你的命名空间(比如
App\),说明composer.json的autoload段有语法错误(逗号遗漏、缩进错、引号不闭合)或路径写错(如写成"app"而不是"app/") - 如果看到 “Skipping …: no namespace found”,说明文件里没写
namespace声明,或声明和 PSR-4 前缀对不上 - 遇到 ParseError 中断?说明 autoload 路径下混入了非法 PHP 文件(
.php.bak、routes.php.txt、带 BOM 的 UTF-8 文件),用find src -name "*.php" -exec php -l {} \;快速排查
检查 autoload 配置是否覆盖到你的类文件
Composer 默认只管 composer.json 里明确声明的路径。你把新类扔在 lib/ 或 helpers/ 下,但 autoload 段只配了 "psr-4": {"App\": "src/"},那 dump-autoload 再勤快也没用。
- PSR-4 要求严格对应:类
App\Http\Controllers\HomeController必须在src/Http/Controllers/HomeController.php,少一层目录、大小写错、文件名多下划线都会失败 - 非标准路径(如函数库、辅助函数)得用
files类型:"files": ["lib/helpers.php"],然后必须再跑一次composer dump-autoload - 开发专用类(如测试类)在
autoload-dev里,普通dump-autoload不处理,要加--dev参数
清理缓存比重跑命令更重要
composer dump-autoload 默认不会删旧文件,只会生成新映射。而 PHP 的 OPCache、IDE 缓存、甚至 vendor/composer/autoload_classmap.php 里的残留路径,都会让你以为“已经修好了”,其实还在读旧数据。
- 手动删掉
vendor/composer/autoload_*.php和vendor/composer/autoload_classmap.php,再跑composer dump-autoload -o - 生产部署后务必重置 OPCache:
php -r "opcache_reset();"(前提是opcache.enable=1) - CI/CD 流程中如果用了
--no-dev,确认autoload-dev里的路径真不需要进生产环境,否则测试类加载失败就是预期行为
最容易被忽略的是:classmap 模式下,Composer 不校验命名空间与文件路径是否匹配,只记路径。所以 autoload_classmap.php 里明明有那个类,new MyClass() 却报错 —— 很可能类文件里 namespace 写错了,或者文件本身语法有问题,但 classmap 已经把它“记住”了。











