psr-0在composer 2.0+中已被彻底移除,配置psr-0会直接报错;必须改用psr-4映射(如"vendor\\": "src/vendor/")或classmap扫描兼容旧类,降级composer不可取。

PSR-0自动加载在Composer中已被弃用,无法直接启用
Composer 2.0 起完全移除了对 psr-0 的原生支持。如果你试图在 composer.json 中写 "psr-0": {"Vendor\": "src/"},运行 composer install 会直接报错:Invalid argument: psr-0 is not supported。这不是配置写错了,是底层根本不认这个字段。
改用 PSR-4 并手动映射旧目录结构
最稳妥的做法是把 PSR-0 的命名约定“翻译”成 PSR-4 的写法。PSR-0 允许下划线转目录(如 Vendor_Foo_Bar → Vendor/Foo/Bar.php),而 PSR-4 不支持下划线转换,但允许你指定任意前缀 + 路径的映射关系。
假设旧项目结构是:
src/ ├── Vendor/ │ └── Foo/ │ └── Bar.php // class Vendor_Foo_Bar └── Helper.php // class Helper
对应地,在 composer.json 中这样写:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"autoload": {
"psr-4": {
"Vendor\": "src/Vendor/",
"": "src/"
}
}
}
-
"Vendor\": "src/Vendor/"覆盖Vendor_Foo_Bar类:虽然类名含下划线,但文件路径已是标准 PSR-4 风格(Vendor/Foo/Bar.php),所以能正常加载 -
"": "src/"是“空前缀”,用于加载无命名空间的类(如Helper),前提是它们位于src/下且文件名与类名一致(Helper.php) - 如果存在
Vendor_Foo_Bar_Baz这种类,且文件路径是src/Vendor/Foo/Bar/Baz.php,它仍能被"Vendor\": "src/Vendor/"匹配到——因为 Composer 查找时只比对命名空间前缀,不校验中间是否有下划线
遇到下划线类名但路径不匹配时,用 classmap 回退
如果旧项目真有大量 Vendor_Foo_Bar 类,却放在 src/Vendor_Foo_Bar.php 这种扁平路径下(即没按命名空间拆目录),PSR-4 就束手无策了。这时必须用 classmap:
{
"autoload": {
"classmap": ["src/"]
}
}
执行 composer dump-autoload 后,Composer 会扫描 src/ 下所有 PHP 文件,提取其中的 class 和 interface 声明,生成静态映射表。这种方式兼容性最强,但缺点也很明显:
- 每次增删类文件后必须重新运行
composer dump-autoload - 无法利用 Composer 的优化加载机制(如生成静态
autoload_classmap.php时会变大) - IDE 自动补全可能失效,因为没明确的命名空间上下文
不要试图降级 Composer 或打补丁
有人会想回退到 Composer 1.x 来继续用 psr-0,这不可取:
- Composer 1.x 已停止维护,存在已知安全漏洞(如 CVE-2021-29475)
- 主流 PHP 版本(8.1+)和新扩展(如
ext-opcache的某些优化)在 Composer 1.x 下行为异常 - 社区生态(如 Laravel、Symfony 的新版本)已全面要求 Composer 2+
真正要花时间的不是绕过限制,而是确认哪些类实际被调用、哪些只是历史残留——很多所谓“PSR-0 依赖”其实只用了其中一两个类,完全可以抽出来重写为 PSR-4 风格,其余代码直接丢弃。










