背景
Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年。FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了下列 PHP 非官方规范:
PSR-0 (Autoloading Standard) 自动加载标准(主要是针对 PHP 5.3 以前没有命名空间的版本)
PSR-1 (Basic Coding Standard) 基础编码标准
PSR-2 (Coding Style Guide) 编码风格向导
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自动加载优化标准(在出现命名空间后有很大的改变)
PSR-6 (Caching Interface):缓存接口
PSR-7 (HTTP Message Interface):HTTP 消息接口
PSR-5没有出现在以上的列表中,是因为还没有投票通过。其中PSR-0已废弃。详情见:http://www.php-fig.org/psr/。
作用
PSR-1 与 PSR-2主要规范代码编码。
PSR-0 是自动载入的类对应的文件存放路径规范。 PSR-4 称为改进的自动加载规范。官方已废弃PSR-0 规范。
目前很多开源库作者要求新加入的成员遵循PSR规范。所以有必要认真了解,并适当的遵循。
PSR-0与PSR-4
PSR-0有更深的目录结构,比如定义了NS为 FooBar=>vendorfooarsrc
,
use FooBarToolRequest
调用NS
。
如果以PSR-0方式加载,实际的目录为vendorfooarsrcFooBarToolRequest.php
如果以PSR-4方式加载,实际目录为vendorfooarsrcToolRequest.php
在PSR-0中目录结构要与命名空间层层对应,无法插入一个单独的目录。VendorPackageClass在psr-0会里被直接转换成同样的路径,而PSR-4则没有这样的强制要求。
对比PSR-0,除了PSR-4可以更简洁外,需要注意PSR-0中对下划线(_)是有特殊的处理的,下划线会转换成DIRECTORY_SEPARATOR,这是出于对PHP5.3以前版本兼容的考虑,而PSR-4中是没有这个处理的,这也是两者比较大的一个区别。
此外,PSR-4要求在autoloader中不允许抛出exceptions以及引发任何级别的errors,也不应该有返回值。这是因为可能注册了多个autoloaders,如果一个autoloader没有找到对应的class,应该交给下一个来处理,而不是去阻断这个通道。
PSR-4更简洁更灵活了,但这使得它相对更复杂了。
相关资源
现在写 PHP,你应该知道这些 - Scholer 的 PHP 之路 - SegmentFault
https://segmentfault.com/a/1190000003844380
PHP-FIG — PHP Framework Interop Group
http://www.php-fig.org/
PHP-FIG — PHP 框架互用工作组
http://www.php-fig.org.cn/
php-fig/fig-standards: Standards either proposed or approved by the Framework Interop Group
https://github.com/php-fig/fig-standards
hfcorriez/fig-standards: PHP PSR代码标准中文版
https://github.com/hfcorriez/fig-standards
PHP 基本编码规范--刘小乐
https://github.com/XiaoLer/php-develop-standards/blob/master/php-basic-coding-standard.md
PHP PSR-1 基本代码规范(中文版) - 光头哥 - SegmentFault
https://segmentfault.com/a/1190000002521577
PHP PSR-2 代码风格规范 (中文版) - 光头哥 - SegmentFault
https://segmentfault.com/a/1190000002521620
PHP PSR-3 日志接口规范 (中文版) - 光头哥 - SegmentFault
https://segmentfault.com/a/1190000002521644
PHP PSR-4 Autoloader 自动加载(中文版) - 光头哥 - SegmentFault
https://segmentfault.com/a/1190000002521658
PSR-0与PSR-4区别 - 光头哥 - SegmentFault
https://segmentfault.com/a/1190000002616752
PHP的PSR-0标准利用namespace来做autoloading
http://blog.csdn.net/sky_zhe/article/details/38523145
PHP PSR-4与PSR-0规范 - zHHHe的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/sky_zhe/article/details/38615615