PSR规范

时间:2024-12-11 15:06:26

背景

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为 Foo\Bar=>vendor\foo\bar\src

use Foo\Bar\Tool\Request调用NS

如果以PSR-0方式加载,实际的目录为vendor\foo\bar\src\Foo\Bar\Tool\Request.php

如果以PSR-4方式加载,实际目录为vendor\foo\bar\src\Tool\Request.php

在PSR-0中目录结构要与命名空间层层对应,无法插入一个单独的目录。Vendor\Package\Class在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.****.net/sky_zhe/article/details/38523145

PHP PSR-4与PSR-0规范 - zHHHe的专栏 - 博客频道 - ****.NET

http://blog.****.net/sky_zhe/article/details/38615615