composer 2.0 起完全移除 PSR-0 支持,旧项目可通过 classmap 手动映射实现兼容,推荐逐步迁移到 PSR-4。

Composer 默认已不再支持 PSR-0,自 Composer 2.0 起完全移除了对 PSR-0 的自动加载逻辑。若你维护的是旧项目(如基于 symfony 2.0–2.7、Zend Framework 1 或早期 laravel),仍需 PSR-0 兼容,可通过手动配置 autoload 并配合类映射或文件映射实现“伪 PSR-0”行为。
确认项目是否真需 PSR-0
PSR-0 已被废弃多年(2014 年被 PSR-4 取代),官方不再推荐。先检查:
- 你的类名是否形如
Vendor_Name_Module_ClassName,且目录结构为Vendor/Name/Module/ClassName.php - 是否存在大量未命名空间的顶层类(如
My_Class→My/Class.php) -
composer.json中是否已有"psr-0": {...}字段(Composer 1.x 兼容但不生效于 2.x+)
用 classmap 模拟 PSR-0 行为
最稳妥的兼容方式:将所有 PSR-0 风格的类文件显式加入 classmap,让 Composer 扫描并生成静态映射表,绕过命名空间解析逻辑。
在 composer.json 中添加:
"autoload": { "classmap": [ "library/", "src/", "modules/" ] }
然后运行:
composer dump-autoload -o
✅ 优势:完全无视命名规范,只要文件存在且类名匹配即可加载;✅ 兼容 Composer 2.x+;⚠️ 注意:新增类后需重新执行 dump-autoload。
降级 Composer 或启用 legacy-autoloader(不推荐)
仅限极特殊场景(如无法修改代码又必须动态加载):
- Composer 1.10.x 是最后一个完整支持 PSR-0 自动发现的版本,可临时锁定:
composer self-update 1.10.25 - 某些老项目通过自定义 autoloader(如 Zend_Loader_Autoloader)接管加载,此时应禁用 Composer 的 autoload,改用原生机制
- 不要尝试用
"psr-0"字段 + Composer 2.x —— 它会被忽略且无警告
逐步迁移到 PSR-4(推荐长期方案)
不是“要不要做”,而是“何时做”。可低风险推进:
- 新建模块全部使用 PSR-4(如
"app": "src/App/") - 用
sed或 ide 批量重命名旧类文件并加命名空间(如My_Class→OldMyClass) - 保留 classmap 加载旧类,新类走 PSR-4,双轨并行过渡
基本上就这些。PSR-0 是历史包袱,不复杂但容易忽略它的实际加载路径——关键不在“声明规范”,而在确保类文件能被真实定位到。
以上就是如何让Composer在自动加载时遵循PSR-0规范?(旧项目兼容)的详细内容,更多请关注php中文网其它相关文章!