PSR-0 已被 Composer 2.0+ 彻底废弃,即使在 composer.json 中配置 "psr-0" 字段也会被静默忽略,仅支持 psr-4、classmap 和 files;旧项目需改用 files 加载或手动 require,迁移 PSR-4 则需调整目录结构与命名空间声明。

PSR-0 已被废弃多年,composer install 或 composer dump-autoload 在现代 Composer(2.0+)中根本不会处理 PSR-0 规则——它只认 psr-4 和 classmap。
为什么 composer.json 里写 "psr-0" 没反应
Composer 2.0 起彻底移除了对 PSR-0 的原生支持。即使你在 composer.json 中保留 "psr-0" 字段,composer dump-autoload 也会静默忽略它,不报错也不生成对应映射。
- 实际行为:Composer 会跳过该字段,仅处理
psr-4、classmap、files等有效类型 - 验证方式:运行
composer dump-autoload -v,观察输出中是否出现Skipping PSR-0类似提示 - 兼容性底线:最低支持 PSR-0 的 Composer 版本是 1.10.x;但连 1.10.x 也已在 2021 年停止维护
旧项目还在用 PSR-0,怎么让它跑起来
核心思路不是“让 Composer 支持 PSR-0”,而是绕过自动加载机制,用最简路径把类文件显式载入。适用于无法立即重构的遗留系统(如 Zend Framework 1、早期 Symfony 2 项目)。
- 删掉
composer.json中整个"psr-0"块,避免干扰 - 改用
"files"加载关键引导类:"autoload": { "files": ["library/Zend/Loader/Autoloader.php", "application/Bootstrap.php"] } - 在入口脚本(如
index.php)顶部手动 require 最顶层的 autoloader:require_once 'library/Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
- 若依赖大量散列命名空间(如
Library_Foo_Bar),可临时补一个简单前缀映射函数并注册到spl_autoload_register()
从 PSR-0 迁移到 PSR-4 的最小改动方案
不重写全部命名空间,只调整目录结构和 composer.json 配置即可启用 Composer 原生加载。
- 假设原 PSR-0 规则是:
"Library_" => "library/",即Library_Foo_Bar对应library/Library/Foo/Bar.php - 改为 PSR-4:将
library/Library/提升为根命名空间目录,声明"Library\\" => "library/Library/" - 类文件路径不变,只需确保
Bar.php内声明namespace Library\Foo;(而非Library_Foo) - 执行
composer dump-autoload后,new Library\Foo\Bar()就能被正确加载 - 注意:PHP 5.3+ 才支持反斜杠命名空间,老项目若仍跑在 PHP 5.2 上,此路不通
真正卡住迁移的往往不是 Composer 配置,而是类内部硬编码的 require_once 'Library/Foo/Bar.php' 或字符串拼接类名——这些必须逐个清理,否则 autoload 根本没机会触发。










