composer 2.x 完全移除 psr-0 支持,psr-0 字段会直接报错;psr-4 必须带结尾反斜杠(如 "app\": "src/");classmap 是加载下划线类名的唯一可靠方式,且优先级高于 psr-4。

Composer 2.x 完全不支持 PSR-0,写进 composer.json 的 psr-0 字段会直接报错:Invalid argument: psr-0 is not supported anymore。所谓“混合加载”,本质是误读配置意图——你不是在启用两种标准,而是在触发错误或静默失效。
为什么 psr-0 + psr-4 配置一运行就失败
Composer 2.0+ 在解析 composer.json 时,遇到 psr-0 字段会立即终止 autoload 构建流程。这不是警告,是硬性拒绝。
- 即使字段被注释掉,某些版本仍会输出
Warning: The PSR-0 autoloading specification is deprecated - 若未注释但项目里存在下划线类名(如
My_Package_Utils),又没配classmap,运行时就会抛出Class not found -
psr-0不是兼容开关,是已移除的废弃语法;保留它只会让composer install或composer dump-autoload直接退出
psr-4 命名空间末尾反斜杠是强制语法标记
写成 "App": "src/" 看似正常,实则会让 Composer 当作 PSR-0 兼容模式处理——PHP 8+ 下极易失败。正确写法必须带结尾反斜杠:"App": "src/"。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 这是区分 PSR-4 和已弃用行为的硬性语法要求,不是风格偏好
- 多个前缀可共存,如
"App\": "src/", "Tests\": "tests/",但"Tests": "tests/"(无反斜杠)会被忽略或降级为兼容模式 - 路径必须相对于
composer.json所在目录;"./src/"和"src/"等价,但"../src/"可能导致部署时路径错乱
遗留类名唯一可靠方案是 classmap
当你无法重命名 Legacy_Core_Helper 这类含下划线的类(比如第三方包已停止维护),classmap 是唯一不依赖命名规则的加载方式。
- 在
composer.json的autoload下添加:"classmap": ["legacy/", "vendor/old-package/src/"] - 运行
composer dump-autoload -o,生成优化后的autoload_classmap.php -
classmap优先级高于psr-4,同名类以classmap结果为准,可避免冲突 - 扫描目录要精确,避免把
tests/或docs/误加进去,否则增大 autoload 文件体积
classmap 和 psr-4 混用时的优先级陷阱
classmap 是自动加载流程的第一道关卡:只要文件路径匹配成功,就立刻返回并 require,完全跳过 psr-4 推导逻辑。
- 如果你在
classmap里写了"src/Cache.php",那么new Cache()就走classmap;哪怕psr-4也映射了App\到src/,它也不会被触发 - 不要让
classmap和psr-4指向同一目录,否则可能因扫描顺序导致部分类未被收录 - 运行
composer dump-autoload -vvv | grep -A5 -B5 "YourNamespace\"可快速定位哪条映射最后注册、实际生效
真正麻烦的从来不是怎么写配置,而是那些散落在 __autoload、class_alias、字符串拼接类名里的隐式加载逻辑——它们不会出现在 composer.json 里,却会在某次 new 调用时突然暴露冲突。










