Class not found 是因命名空间、路径、类名未严格对齐;composer.json 中 autoload 必须为顶层键,路径和命名空间需双反斜杠结尾且大小写敏感,修改后须运行 composer dump-autoload。

Class not found 不是 Composer 坏了,是你没对齐命名空间、路径、类名这三样东西——少一个反斜杠、多一级目录、大小写错一个字母,它就直接放弃加载。
composer.json 的 autoload 字段必须写在顶层
autoload 不能嵌在 require、config 或其他字段下面,否则 Composer 完全忽略。它必须和 require 并列,是 composer.json 的一级键:
{
"name": "my/app",
"autoload": {
"psr-4": {
"App\": "src/"
}
},
"require": { ... }
}
-
autoload键名拼错(比如写成auto-load或autoloader)会导致配置静默失效 - 路径值
"src/"是相对于composer.json所在目录的子路径,不支持../src或/var/www/src - 命名空间键必须用双反斜杠结尾:
"App\"✅,"App"❌,"App\"在 JSON 中实际表示App(单个反斜杠)
命名空间、目录结构、类名三者必须严丝合缝
Composer 不扫描文件,它只做字符串拼接:给定 AppHttpControllersHomeController,它会尝试加载 src/Http/Controllers/HomeController.php。
- 文件路径必须和命名空间后缀完全对应:
AppHttpControllers→ 目录必须是src/Http/Controllers/(注意大小写,Linux/macOS 下http≠Http) - 类文件名必须和类名一致:
class HomeController→ 文件必须叫HomeController.php,不是homecontroller.php或Controller.php - PHP 文件里的
namespace声明必须完整、无空格、无 tab 缩进:namespace AppHttpControllers;✅,namespace AppHttpControllers ;❌
改完 composer.json 后必须手动运行 dump-autoload
vendor/autoload.php 只是入口,真正起作用的是 vendor/composer/autoload_psr4.php —— 这个文件不会自动更新。
- 开发时执行:
composer dump-autoload -o(生成优化版 classmap,跳过运行时路径检查) - 调试阶段建议先用:
composer dump-autoload(不加-o),避免掩盖路径错误 - CI/CD 部署时,应显式执行
composer dump-autoload --no-dev,防止autoload-dev里的测试类混入生产环境 - 运行后可直接检查:
var_dump(include 'vendor/composer/autoload_psr4.php');,确认数组里有没有你配的"App\" => ["src/"]
多个 PSR-4 映射共存时要注意前缀覆盖
Composer 按“最长前缀优先”匹配,顺序不重要,但前缀设计不当会截胡:
- 正确示例:
"App\": "src/"和"App\Tests\": "tests/App/"可共存 - 危险示例:
"App\": "src/"和"App\Http\": "legacy/http/"—— 后者永远不会被触发,因为AppHttpController已被App\匹配到src/Http/Controller.php - 测试类强烈建议用
autoload-dev单独配置,避免污染生产 autoloader
最常被忽略的一点:PSR-4 不是“自动发现”,它是确定性路径拼接;所有失败几乎都源于某一处的大小写、斜杠或层级偏差,而不是配置没生效——验证时直接看 autoload_psr4.php 里的数组内容,比猜错误原因快得多。


















