PSR-4 命名空间必须以双反斜杠结尾、路径以正斜杠结尾、大小写与文件系统完全一致,三者缺一即导致 Class not found;正确写法仅 "App\" ✅,因 Composer 解析时将 "App\" 视为字面量 App,确保类名 AppHttpControllerHomeController 正确映射到 src/Http/Controller/HomeController.php。

PSR-4 命名空间必须以双反斜杠结尾、路径必须以正斜杠结尾、大小写必须和文件系统完全一致——三者缺一,Class not found 就必然发生。
命名空间末尾为什么非得是 "App\" 而不是 "App"
Composer 解析 composer.json 时,把 "App\" 当作字符串字面量处理,实际生效的是 App(单反斜杠)。如果写成 "App",它会被当成完整命名空间前缀,导致类名 AppHttpControllerHomeController 被错误拼成 AppHttpControllerHomeController.php,而不是你想要的 src/Http/Controller/HomeController.php。
常见错误写法:
-
"App"❌(无反斜杠,完全不匹配) -
"App"❌(JSON 中未转义,解析失败) -
"\App\"❌(开头非法反斜杠,Composer 7+ 直接拒绝安装)
正确写法只有一种:"App\" ✅
composer dump-autoload 不是“刷新”,是重写映射表
vendor/autoload.php 只负责注册加载器,真正干活的是 vendor/composer/autoload_psr4.php——它是个硬编码的 PHP 数组,内容来自上一次 composer dump-autoload 的扫描结果。
这意味着:
- 改了
composer.json里的autoload.psr-4,不执行该命令,映射表里就还是旧数据 - 新增了
src/Service/Logger.php,不执行该命令,表里就没有这条记录 - CI/CD 流水线中跳过这步(比如用了
--no-scripts),部署后必报错
调试建议:执行 composer dump-autoload -v,观察输出是否列出你的命名空间和对应文件;再直接 var_dump(include 'vendor/composer/autoload_psr4.php'); 确认键值对是否存在。
路径与文件系统大小写必须严丝合缝
Windows 上 src/http/controller/homecontroller.php 可能“碰巧”加载成功,但 Linux 下会彻底失败——因为 PSR-4 映射是纯字符串替换:AppHttpControllerHomeController → 剥离 App → HttpControllerHomeController → 替换 为 / → Http/Controller/HomeController.php → 拼上 src/ → src/Http/Controller/HomeController.php。
所以:
-
namespace AppHttpControllers;必须对应src/Http/Controllers/(不是src/http/controllers/) - 类名
HomeController的文件必须叫HomeController.php(不是homecontroller.php) - Git 默认在 Linux/macOS 上设
core.ignorecase = true,重命名文件时可能无声失效,需用git config core.ignorecase false修复
name 字段不是装饰,它决定 autoload 是否能启动
composer.json 中的 name 字段是全局唯一标识符,格式必须为 vendor/package,且全部小写、仅含字母、数字、短横线和单斜杠。写错一个字符,Packagist 会拒收,别人 composer require 会失败,本地 autoload 也可能错位。
典型错误:
-
"name": "MyName/json-helper"❌(vendor 大写) -
"name": "myname/json_helper"❌(package 含下划线) -
"name": "mylib"❌(无斜杠,被补成root/mylib)
更关键的是:name 会影响默认命名空间推导逻辑。如果你没显式配置 autoload.psr-4,Composer 会尝试把 myname/json-helper 转成 MynameJsonHelper,但你代码里用的是 App,那自动加载永远找不到类。
所以务必显式写死:"autoload": {"psr-4": {"App\": "src/"}},并确保 name 和这个前缀在语义上可维护——比如 "name": "app/core" 对应 "App\": "src/" 是合理搭配。











