PSR-0 已被 Composer 2.0+ 彻底移除,配置即报错;PSR-4 要求命名空间前缀以双反斜杠结尾(如"App\": "src/"),且不解析下划线为路径分隔符,映射路径比 PSR-0 少一层,需同步迁移文件目录结构。

PSR-0 已被 Composer 彻底移除,不是“不推荐”,而是根本不能用;你在 composer.json 里写 psr-0 字段,Composer 2.0+ 会直接报错退出,连警告都不会给你留。
为什么 composer dump-autoload 报 [InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator
这不是 PSR-0 的问题,是 PSR-4 配置写错了——psr-4 的命名空间前缀必须以反斜杠结尾,且 JSON 中要写成双反斜杠。
-
"App": "src/"❌ 错:没反斜杠,触发该错误 -
"App\": "src/"✅ 对:JSON 解析后为"App",符合要求 -
"App/": "src/"❌ 错:用了正斜杠,PHP 命名空间分隔符是反斜杠 - 如果同时存在
psr-0和psr-4块,Composer 会优先读psr-4,但旧psr-0块仍会触发弃用警告(1.x)或直接报错(2.0+)
psr-4 映射路径比 psr-0 少一层目录,这是最常踩的坑
假设你配置了 "App": "src/":
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PSR-4 下,
AppControllersHome→src/Controllers/Home.php - PSR-0 下,同样配置,
AppControllersHome→src/App/Controllers/Home.php(多出App/子目录) - 这个“冗余嵌套”正是 PSR-0 被淘汰的主因:它把整个命名空间都塞进路径,导致迁移时必须重排目录结构
- 如果你从老项目升级,别只改
composer.json,还要把类文件从src/App/...移到src/...
下划线 _ 在类名里有没有意义,决定自动加载成败
PSR-0 把下划线当路径分隔符,PSR-4 完全无视它——这是行为级差异,不是风格偏好。
- PSR-0:
My_Class_Name→My/Class/Name.php(哪怕在App命名空间下,也还是src/App/My/Class/Name.php) - PSR-4:
My_Class_Name→src/My_Class_Name.php(文件名必须与类名**严格一致**,含大小写和下划线) - 如果你有遗留类名含下划线,又不想重命名,就别指望 PSR-4 自动加载它;改用
classmap扫描生成静态映射更靠谱 - PSR-4 不 fallback:
"App\": "src/"只匹配以App开头的命名空间,不会因为找不到AppFooBar就去src/下找Foo.php
最容易被忽略的是:PSR-4 映射生效必须三者同时满足——composer.json 格式正确、路径是相对项目根的合法字符串、执行过 composer dump-autoload;少一个,Class not found 错误连具体缺哪个文件都不会告诉你。

















