PSR-0 已被废弃,Composer 2.0+ 完全移除支持;项目若需加载 PSR-0 风格类(如 Vendor_Name_ClassName → vendor_name/class_name.php),须降级至 Composer 1.x 并在 composer.json 的 autoload 段中配置 psr-0 键,例如 {"autoload": {"psr-0": {"Acme_": "src/"}}},表示 Acme_Foo_Bar 映射为 src/Acme/Foo/Bar.php(下划线转斜杠,首字母大写保留);psr-0 值必须是字符串路径,多路径需用数组(仅 Composer 1.10.1+ 支持),路径须存在且可读,否则运行时报 Class not found;PSR-0 被弃用因其设计歧义(下划线语义不明确),而 PSR-4 通过明确命名空间与目录映射解决该问题;Composer 2.x 移除全部 psr-0 代码,遇到该字段仅警告并跳过;主流框架自 2015 年起全面转向 PSR-4,旧项目迁移推荐调整目录结构与 composer.json 为 psr-4,并将类名改为命名空间形式(如 namespace Acme\Foo; class Bar),若无法修改类名可用 "files

PSR-0 已被废弃,Composer 2.0+ 完全移除支持;若项目仍需加载 PSR-0 风格的类(如 Vendor_Name_ClassName 映射到 vendor_name/class_name.php),必须降级到 Composer 1.x 并手动配置 autoload —— 但这是临时兼容方案,不建议长期使用。
Composer 1.x 中如何声明 PSR-0 自动加载
在 composer.json 的 autoload 段中显式写入 psr-0 键(注意:Composer 2.0+ 解析时会直接报错 Invalid argument supplied for foreach() 或忽略该字段):
{
"autoload": {
"psr-0": {
"Acme_": "src/"
}
}
}
上述配置表示:所有以 Acme_ 开头的类名,按 PSR-0 规则拆解为目录路径,例如 Acme_Foo_Bar → src/Acme/Foo/Bar.php(下划线转斜杠,首字母大写保留)。
-
psr-0值必须是字符串(路径),不能是数组(Composer 1.x 不支持多路径映射同一前缀) - 若需多个根路径,要写多个键:
"Acme_": ["src/", "legacy/"]—— 仅 Composer 1.10.1+ 支持数组值 - 路径必须存在且可读,否则
composer dump-autoload不报错,但运行时抛出Class not found
为什么 Composer 2.x 不再支持 PSR-0
PSR-0 存在歧义设计:下划线既可能表示命名空间分隔符,也可能只是类名一部分(如 My_Class_v2),导致自动加载器无法可靠推导文件路径。PSR-4 用明确的命名空间 + 目录映射消除了该问题。
- Composer 2.0 移除了全部
psr-0相关代码,composer install时遇到该字段会警告并跳过 - 即使强制用 Composer 1.x 生成 autoload,PHP 7.4+ 的 opcache 也可能因文件路径不规范导致类缓存失效
- 主流框架(Laravel、Symfony)自 2015 年起已全面转向 PSR-4,依赖包基本不再提供 PSR-0 兼容层
旧项目迁移 PSR-4 的最小改动方式
不重写类名,只调整目录结构和 composer.json:
src/
├── Acme/
│ └── Foo/
│ └── Bar.php // 内部 class Acme_Foo_Bar {}
对应改为 PSR-4:
{
"autoload": {
"psr-4": {
"Acme\\": "src/Acme/"
}
}
}
- 类名需同步改为命名空间形式:
class Acme_Foo_Bar→namespace Acme\Foo; class Bar - 若无法修改类名(如闭源 SDK),可用
files加载:"files": ["src/helpers.php"],但仅适用于函数/常量 - 用
composer validate确认 JSON 格式合法,再composer dump-autoload -o生成优化后映射
真正棘手的是那些把下划线当命名空间又没文档的遗留包——它们往往依赖 __autoload 或自定义加载器,强行塞进 Composer 的 PSR-0 只会让问题延迟爆发。










