composer 2.0+ 不再支持 psr-0,残留配置会直接导致安装或重载失败;psr-4 要求命名空间以双反斜杠结尾、路径为相对路径,且类名下划线不再映射目录结构。

Composer 自动加载报 Class not found,绝大多数情况不是代码写错了,而是 PSR-4 配置或目录结构没对齐——PSR-0 已在 Composer 2.0+ 中彻底消失,残留配置会直接导致 composer install 或 composer dump-autoload 报错退出,根本不会走到类找不到那一步。
composer.json 里还有 "psr-0" 就会失败
Composer 2.0+ 不再解析 psr-0 字段,哪怕只写 "psr-0": [] 或注释里留着它,都会触发硬性拒绝:
- 错误信息可能是
Invalid argument supplied for foreach(),也可能是更直白的PSR-0 is not supported anymore - 别指望加
"classmap"或删掉 autoload 块能绕过——Composer 在解析阶段就终止了 - 老项目迁移时,必须手动删掉整个
"psr-0"块,不能只改名或注释
"App\": "src/" 这个双反斜杠不是笔误
psr-4 的命名空间前缀必须以反斜杠结尾,而 JSON 中反斜杠是转义字符,所以得写成双反斜杠。这是最常被忽略的语法点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"App": "src/"❌:没反斜杠,报[InvalidArgumentException] A non-empty PSR-4 prefix must end with a namespace separator -
"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:
- 如果
src/App/目录还存在,它是冗余的,得把Controllers/、Models/等子目录提到src/下一级 - 不挪目录只改配置,运行时只会报
Class not found,不会提示缺哪段路径 - 多个命名空间前缀(如
"App\"和"Tests\")要各自检查对应目录结构,不能默认套用同一层级
下划线 _ 在类名里不再当路径分隔符
PSR-0 会把 My_Class_Name 拆成 My/Class/Name.php;PSR-4 完全无视下划线,只认字面类名:
-
My_Class_Name→ 必须对应My_Class_Name.php,大小写和下划线一个都不能错 - 如果你有大量含下划线的旧类,别硬套 PSR-4;改用
"classmap": ["legacy/"]让 Composer 扫描生成静态映射更可靠 - 这类问题不会在
dump-autoload阶段暴露,只会在运行时突然失败,排查成本高
真正容易卡住的,是那些没被显式调用、却依赖 PSR-0 行为的类——它们不会出现在 dump-autoload -v 输出里,也不会进 autoload_psr4.php 映射表,但一旦被某个边缘逻辑触发,就只剩 Class not found 四个字。










