Class not found 的根本原因是 PSR-4 路径计算失败:命名空间、目录、文件名三者必须严格匹配,反斜杠转义、路径结尾斜杠、大小写均不可出错,且必须执行 composer dump-autoload 更新映射表。

Class not found 不是因为 Composer “没找到”,而是它按规则算出的路径根本不存在——命名空间、目录、文件名三者只要差一个字符或大小写,就必然失败。
psr-4 的命名空间前缀必须写成 "App\"
JSON 中单个反斜杠 是非法转义符,"App" 会解析失败;不加反斜杠的 "App" 会被当作文本字面量,导致 Composer 去找 AppHttpController.php 而不是 src/Http/Controller.php。只有双反斜杠 "App\" 才能让 Composer 正确识别为命名空间前缀 App。
-
"App\"✅:解析后为App,触发 PSR-4 拼接逻辑 -
"App"❌:无转义,匹配行为异常,常静默失效 -
"\App\"❌:开头多一个反斜杠,Composer 2.9+ 直接拒绝安装
src/ 这个路径不能写成 src 或 /src/
路径是相对于 composer.json 所在目录的相对路径,且必须真实存在、可读。结尾斜杠不是可有可无的风格问题,而是语义分隔关键:
-
"src/"✅:明确指向目录,拼接时不会误认为是同名文件 -
"src"⚠️:若项目下恰好存在名为src的文件(非目录),自动加载直接中断 -
"/src/"❌:以/开头被识别为绝对路径,composer dump-autoload可能静默跳过或报错Invalid path -
"../lib/"✅:允许上层路径,但部署时必须确保该路径存在且权限正确
类文件路径由命名空间“砍前缀 + 替换 \ 为 / + 拼后缀”严格计算
Composer 不扫描目录,也不 fallback。它只做字符串操作:AppHttpControllersHome 遇到 "App" => "src/" 映射,就执行:
- 砍掉前缀
App→ 得到HttpControllersHome - 把所有
\替换为/→ 得到Http/Controllers/Home - 拼上
.php→src/Http/Controllers/Home.php
这个文件必须真实存在,且大小写完全一致:home.php、HomeController.php、src/http/controllers/home.php 全部无效。
改了 composer.json 或增删类文件后,必须运行 composer dump-autoload
vendor/autoload.php 只是注册加载器,真正干活的是 vendor/composer/autoload_psr4.php —— 它是一个硬编码的 PHP 数组,内容来自上一次 dump-autoload 的扫描结果。
- 新增了
src/Services/UserService.php,但没运行该命令 → 映射表里没有这条记录 - 把
"App\" => "src/"改成"MyApp\" => "src/",但没运行 → 表里还是旧前缀 - CI/CD 中用了
--no-scripts,跳过这步 → 部署后必报Class not found - 调试建议:
composer dump-autoload -v看是否列出你的命名空间;再var_dump(include 'vendor/composer/autoload_psr4.php')确认键值对是否存在
最容易被忽略的点是:PSR-4 不验证命名空间语法合法性,也不检查类是否存在。它只机械地做字符串替换。你写的 namespace AppHttpControllers; 和 src/Http/Controllers/Home.php 必须和 "App\" => "src/" 这条配置严丝合缝——差一个反斜杠、一个斜杠、一个大小写,就彻底断开。











