psr-4映射需在composer.json的autoload段手动配置,如"app\": "src/",并运行composer dump-autoload生成vendor/composer/autoload_psr4.php;路径与命名空间须严格对齐,否则类加载失败。

composer.json 里怎么写 psr-4 映射才生效
PSR-4 自动加载规则不是“生成”出来的,而是你手动在 composer.json 的 autoload 段里配好后,运行 composer dump-autoload 才会写入 vendor/composer/autoload_psr4.php —— 这个文件才是实际被加载器读的。
常见错误是只改了目录结构、没更新配置,或者路径末尾多写了 或少写了 /:
-
"App\": "src/"✅ 正确:命名空间结尾有双反斜杠,路径结尾用正斜杠 -
"App": "src/"❌ 错误:PHP 里是转义符,实际变成"App" -
"App\": "src"⚠️ 危险:如果src不是目录(比如拼错成sr),composer dump-autoload不报错,但运行时类找不到
为什么 vendor/composer/autoload_psr4.php 里映射对不上
这个文件是 Composer 自动生成的“快照”,内容完全取决于 composer.json + 当前磁盘上的目录结构。它不会校验路径是否存在,也不会递归扫描子目录——只认你写的那一行路径。
典型场景:
- 你配了
"App\": "src/",但实际类文件放在src/Controllers/UserController.php,命名空间却是AppHttpControllers→ 缺少Http\映射,自动加载失败 - 你改了
composer.json但忘了运行composer dump-autoload→ 文件没更新,旧映射还在用 - 你用
composer install而不是dump-autoload→ 它只在安装依赖时顺带重生成,不保证读取最新配置
开发中动态加命名空间要不要重新 dump
要。哪怕只是新增一个 "Utils": "lib/utils/",也必须手动触发 composer dump-autoload,否则新规则不会进 autoload_psr4.php,class_exists() 或 new UtilsHelper 都会报 Class not found。
顺带注意:
-
composer dump-autoload -o(优化模式)会生成扁平化映射,适合生产环境,但开发时没必要——它不支持热更新,改了代码还得再 dump - 如果你同时用了
autoload-dev,记得 dev 下的映射只在require-dev包或测试时生效,和主 autoload 是两套 - Windows 下路径大小写不敏感,但 Linux 严格区分;
src/和Src/在服务器上就是两个目录
psr-4 映射和实际文件结构不一致时的表现
Composer 不检查一致性,只按规则拼路径。比如你配了 "Api\": "app/api/",但写了 class ApiUser {} 在 app/api/User.php,它会去找 app/api/Api/User.php —— 因为 PSR-4 要求命名空间前缀必须和目录名对齐。
也就是说,Api\User 对应的文件路径 = app/api/ + User.php,而 Api\V1\User 才对应 app/api/V1/User.php。
容易忽略的一点:
- 命名空间里的
\全部被转成系统路径分隔符(/或),所以"App\Http\"+UserController→src/Http/UserController.php(假设映射是"App\": "src/") - 如果类名含下划线(如
User_Controller),PSR-4 不处理,它只认驼峰或纯字母,下划线会被当字面量拼进路径
路径拼出来不存在,就直接抛 Class not found,不会尝试其他映射或 fallback。










