composer 2.0+ 已移除 psr-0 支持,残留 "psr-0" 字段会导致硬性报错;psr-4 要求命名空间前缀以双反斜杠结尾(如 "app\": "src/"),路径须为相对路径,且类名下划线不转换,否则需改用 classmap。

Composer 2.0+ 不再支持 PSR-0,只要 composer.json 里还留着 "psr-0" 字段,composer install 或 composer dump-autoload 就会直接报错退出——不是警告,是硬性拒绝。
为什么 composer dump-autoload 报 [InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator
这不是 PSR-0 残留导致的,纯粹是 psr-4 配置写错了。Composer 要求命名空间前缀必须以反斜杠结尾,而 JSON 中反斜杠需转义,所以必须写成双反斜杠。
-
"App": "src/"❌:没反斜杠,触发该错误 -
"App/": "src/"❌:用了正斜杠,PHP 命名空间分隔符只能是\ -
"App\": "src/"✅:JSON 解析后为"App\",符合要求 - 路径值必须是相对路径(如
"src/"),不能以/开头("/src/"是非法绝对路径)
PSR-4 映射路径比 PSR-0 少一层,文件必须挪位置
旧项目用 PSR-0 配置 "App": "src/" 时,类 App\Controllers\Home 对应文件是 src/App/Controllers/Home.php;换成 PSR-4 后,同样前缀 "App\": "src/",它只找 src/Controllers/Home.php。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果
src/App/目录还存在,它是冗余的,得把Controllers/、Models/等子目录提到src/下一级 - 不挪目录只改配置,运行时只会报
Class not found,不会提示缺哪段路径 - 多个命名空间前缀(如
"App\"和"Tests\")要各自检查对应目录结构,不能默认套用同一层级
类名含下划线 _ 的旧代码根本无法被 PSR-4 自动加载
PSR-0 会把 My_Class_Name 拆成 My/Class/Name.php;PSR-4 完全无视下划线,只认字面类名 —— 所以它必须对应 My_Class_Name.php,大小写和下划线一个都不能错。
- 如果你有大量
Vendor_Core_Utils这类类名,别硬套 PSR-4 - 不想重命名类,就别改
psr-4配置;改用"classmap": ["legacy/"]让 Composer 扫描生成静态映射更可靠 - 这类问题不会在
dump-autoload阶段暴露,只会在运行时突然失败,排查成本高
最麻烦的不是语法细节,而是那些没被显式调用、却依赖 PSR-0 行为的类——它们不会报错,直到某次请求才突然找不到。务必逐个核对含下划线的类名与实际文件名是否严格一致,再决定是重命名、挪目录,还是切到 classmap。










