composer dump-autoload -v 可定位 autoload 失效原因:检查命名空间是否被扫描、autoload_psr4.php 映射是否正确、psr-4 与 classmap 是否冲突、class_exists 返回 false 则确认 autoload 层失效。

composer dump-autoload -v 会直接告诉你哪条规则没生效
运行 composer dump-autoload -v,它会逐行打印扫描行为:哪些目录被打开、哪些文件被跳过、哪些命名空间前缀被识别、哪一行 PSR-4 配置根本没进解析流程。如果输出里压根没出现你的命名空间(比如 App),说明 composer.json 的 autoload 段根本没被读取——常见原因有:psr-4 键名拼错(写成 psr4)、JSON 缺少逗号或多了逗号、末尾反斜杠漏掉("App" 而非 "App\")、路径用了 ./src/ 这种相对写法(Composer 只认相对于 composer.json 的路径)。
vendor/composer/autoload_psr4.php 是唯一真相源
别猜,直接打开 vendor/composer/autoload_psr4.php,搜索你的命名空间前缀(如 'App')。确认它映射到的值是类似 $baseDir . '/src' 的表达式,且 $baseDir 在当前环境下确实指向项目根目录。常见翻车点:$baseDir 实际指向 /var/www/vendor/../..,但部署时代码在 /app,导致拼出的物理路径根本不存在;或者路径里混用了正斜杠和反斜杠(Windows 下可能侥幸通过,Linux 下静默失败)。
PSR-4 和 classmap 混用时类名不能重叠
如果你在 psr-4 里配了 "MyLib\": "lib/",又在 classmap 里加了 "lib/Helper.php",而 Helper.php 里没有 namespace MyLib;,那这个文件就“两头不靠”:PSR-4 不认,classmap 又被 PSR-4 规则压制。排查要点:
- 同一类名不能同时出现在两种 autoload 规则中
- PSR-4 是命名空间驱动,只看
namespace声明 + 目录结构 - classmap 是路径驱动,适合无命名空间的老代码,但必须确保文件路径真实存在且可读
class_exists('AppServicesUserService') 返回 false 就坐实 autoload 失效
在目标环境上执行这行命令:php -r "require 'vendor/autoload.php'; var_dump(class_exists('AppServicesUserService'));"。返回 bool(false) 就能排除代码逻辑或 use 引用问题,锁定为 autoload 层失效。此时再结合 composer dump-autoload -v | grep -A5 'App\' 看是否扫描到该命名空间,以及 ls -l src/Services/UserService.php 确认文件存在、大小写完全一致(Linux 区分大小写)、权限可读。命名空间声明漏反斜杠、文件名多空格、路径里有隐藏字符(如 BOM),都会让 PSR-4 截取逻辑偏移,最终查错位置。











