PSR-0 已被 Composer 2.0+ 彻底移除,配置中残留 "psr-0" 会导致 install 或 dump-autoload 直接报错;PSR-4 要求命名空间前缀以双反斜杠结尾、路径为相对路径、下划线不作分隔符,且映射路径比 PSR-0 少一层。

PSR-0 已彻底失效,Composer 2.0+ 不再解析它;任何残留的 "psr-0" 配置都会导致 composer install 或 composer dump-autoload 直接报错退出。
为什么 composer.json 里还有 psr-0 就会失败
Composer 2.0 起已完全移除 PSR-0 解析逻辑。不是“警告”,是硬性拒绝:
- 错误信息可能是
Invalid argument supplied for foreach(),也可能是更直白的PSR-0 is not supported anymore - 哪怕只留一行
"psr-0": [],也会触发解析失败 - Composer 1.x 时代还能看到弃用警告,现在连警告都不给——直接不干活
"psr-4" 的命名空间前缀必须以双反斜杠结尾
这是最常踩的格式坑。JSON 中写成 "App\": "src/" 才对,不是 "App": "src/",也不是 "App/": "src/":
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"App"→ 错:Composer 报[InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator -
"App\"→ 对:JSON 中双反斜杠会被解析为单个反斜杠,即实际前缀是App\ - 路径值不能是绝对路径,比如
/var/www/myapp/src/;必须是相对于项目根目录的相对路径,且带引号
PSR-4 不再把下划线 _ 当路径分隔符
类名里有下划线,就真的只是类名的一部分:
-
My_Class_Name→ PSR-4 要求文件名就是My_Class_Name.php,路径按命名空间剩余部分展开,比如App\Models\My_Class_Name对应src/Models/My_Class_Name.php - PSR-0 下,
My_Class_Name会被拆成My/Class/Name.php,这在 PSR-4 中完全不存在 - 迁移旧项目时,如果原来靠下划线生成目录结构,现在必须重命名类或同步改文件名,否则
Class not found但不提示具体路径
PSR-4 映射路径比 PSR-0 少一层目录
假设配置 "App\": "src/":
-
App\Controllers\Home→ PSR-4 加载src/Controllers/Home.php - 同样配置下,PSR-0 会去找
src/App/Controllers/Home.php(多出App/子目录) - 这意味着:如果你 src/ 下真有
App/目录,那它对 PSR-4 是冗余的,反而容易引发路径错位或重复嵌套
真正麻烦的不是语法细节,而是旧项目迁移时那些没被显式调用、却依赖 PSR-0 行为的类——它们不会在 dump-autoload 阶段报错,只会在运行时突然找不到类。务必检查所有含下划线的类名和实际文件名是否严格一致。

















