psr-4映射必须严格一致:命名空间、文件路径、composer.json配置三者需完全匹配,且双反斜杠不可省略,修改后须执行composer dump-autoload -o生成优化映射。

PSR-4映射写错一个反斜杠就Class not found
Composer 不会“猜”你的命名空间,它严格按 composer.json 里写的键去匹配类名。最致命的错误就是把 "App\" 写成 "App" 或 "App"——前者在 JSON 里会被解析为 "App"(转义失败),后者则被当成完整命名空间,导致 AppHttpControllerHome 被拼成 AppHttpControllerHome.php,而不是你期望的 src/Http/Controller/Home.php。
-
"App\"✅:双反斜杠是必须的,JSON 解析后变成App -
"App\"和"App\Controller\"不能共存——后者前缀被前者覆盖,永远匹配不到 - 路径不能以
/开头(如"/src/"),否则是绝对路径,Composer 直接报Invalid path - 路径末尾加不加
/不强制,但推荐加("src/"),避免和同名文件(如src文件)冲突
为什么vendor/autoload.php引入了还是Class not found
90% 的“找不到类”不是 Composer 配错了,而是开发时三者没对齐:PHP 文件里的 namespace、文件实际路径、composer.json 映射三者必须严丝合缝。
- 类文件名必须等于类名 +
.php,大小写完全一致:class ApiResponse→ 必须叫ApiResponse.php,不是apiresponse.php或ApiResponseController.php -
namespace AppHttpControllers;对应的路径必须是src/Http/Controllers/,不能是src/http/controllers/(Linux 下大小写敏感) - 忘记运行
composer dump-autoload——改完composer.json后,vendor/autoload.php不会自动更新,它只读vendor/composer/autoload_psr4.php这个生成文件 - 手动
require_once 'xxx.php'绕过了自动加载,此时命名空间声明无效
autoload-dev 是用来隔离测试代码的,不是可选项
测试类(比如 TestsUnitExampleTest)不该出现在生产环境的自动加载表里,既增加内存开销,又可能因依赖泄露引发线上异常。
- 把测试命名空间单独配在
"autoload-dev"下:"Tests\": "tests/",而不是混进主"autoload" -
composer install --no-dev时,autoload-dev的映射不会被写入autoload_psr4.php - CI/CD 中应固定用
composer install --no-dev --optimize-autoloader,避免本地未提交的 autoload 文件污染部署 - 别试图用
"": "tests/"或"\": "tests/"——空字符串或单反斜杠是非法前缀,Composer 7+ 会直接拒绝安装
执行dump-autoload时加 -o 参数不是“锦上添花”,而是开发常态
不加 -o 时,Composer 运行时要动态拼路径、检查文件是否存在;加了之后,它提前生成静态 classmap,跳过所有文件系统调用,加载速度提升明显,尤其在大量类的项目中。
- 日常开发建议始终用
composer dump-autoload -o,而非裸命令 -
-o模式下,即使目录结构临时出错(比如某级子目录不存在),也不会报错——它只认生成时的映射,所以更要确保 dump 前路径真实存在 - 如果用了符号链接(symlink)或 IDE 自动生成嵌套命名空间(如
AppHttpControllersV1User),务必确认src/Http/Controllers/V1/User.php是真实路径,不是软链指向的另一处
PSR-4 的复杂点不在语法,而在它要求你同时维护三份一致的信息:代码里的 namespace、磁盘上的文件路径、配置里的字符串映射。少盯一眼大小写,漏一个反斜杠,或者忘了 dump-autoload,就会卡在 Class not found 上——它不报错,只是沉默地找不到。










