PSR-0是Composer早期自动加载标准,已废弃;它要求类名完全映射路径(含命名空间前缀)、支持下划线转斜杠、大小写敏感;PSR-4精简为剥离前缀后拼路径、弃用下划线、降低嵌套、提升性能与模块化。

PSR-0 是 Composer 早期采用的自动加载标准,它通过类名(含命名空间或下划线分隔)严格映射到文件路径,现已废弃,但理解其机制有助于看清 PSR-4 的改进逻辑。
PSR-0 的核心工作方式
PSR-0 要求“类名完全展开为路径”,包括命名空间前缀本身也必须出现在文件系统中:
- 若配置
"Acme\\": "src/",则类Acme\Blog\Article必须位于src/Acme/Blog/Article.php - 支持下划线转路径:类
Acme_Blog_Article会被解析为src/Acme/Blog/Article.php - 类名与文件名必须大小写完全一致,且每个命名空间段都对应一个子目录
- 映射关系最终写入
vendor/composer/autoload_namespaces.php
PSR-4 的关键差异
PSR-4 去掉冗余层级,只把命名空间前缀“剥离”后,用剩余部分拼路径:
- 同样配置
"Acme\\": "src/",类Acme\Blog\Article对应src/Blog/Article.php(不再重复Acme目录) - 完全不处理下划线:
Acme_Blog_Article不再被识别为有效命名空间类,直接报错或跳过 - 允许更扁平的目录结构,比如
Acme\Utils\Helper可放在src/Utils/Helper.php - 映射关系存于
vendor/composer/autoload_psr4.php
为什么 PSR-0 被淘汰
它在现代 PHP 开发中暴露了明显缺陷:
- 目录嵌套过深:长命名空间如
MyCompany\EnterpriseApp\Services\Cache强制生成多层目录,维护和导航成本高 - 兼容旧语法带来混淆:下划线转斜杠规则与真实命名空间语义冲突,容易出错
- 性能开销大:每次加载都要做多次字符串替换和路径拼接
- 无法适应模块化组织:子命名空间不能自由归并到同一目录下
实际配置对比示例
假设项目根目录有 src/,目标类是 App\Controllers\Home:
-
PSR-0 配置:
"App\\": "src/"→ 实际路径必须是src/App/Controllers/Home.php -
PSR-4 配置:
"App\\": "src/"→ 实际路径只需src/Controllers/Home.php
PSR-4 不是推倒重来,而是对 PSR-0 的精简与正交化——去掉历史包袱,专注命名空间本意。Composer 自 2013 年起默认推荐 PSR-4,所有新项目应直接使用它。










