PHP中对PSR-1、PSR-2规范理解
PHP-FIG
在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG。就是这个联盟组织发明和创造了PSR-[0-4]规范
FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写,由几位开源框架的开发者成立于2009 年,从那开始也选取了很多其他成员进来,虽然不是 “官方” 组织,但也代表了社区中不小的一块。
项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了
PHP 的发展,解决这个程序设计师由来已久的困扰。
目前已表决通过了 6 套标准,已经得到大部分 PHP 框架的支持和认可。
1 基础编码规范 PSR-1
2 编码风格规范 PSR-2
3 日志接口规范 PSR-3
4 自动加载规范 PSR-4
6 缓存接口规范 PSR-6
7 HTTP 消息接口规范
基础编码规范
- PHP代码文件 必须 以
<?php
或<?=
标签开始; - PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini配置文件等),二者只能选其一;
「副作用」(side effects) 一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。
「副作用」包含却不仅限于:- 生成输出
- 直接的 require 或 include
- 连接外部服务
- 修改 ini 配置
- 抛出错误或异常
- 修改全局或静态变量
- 读或写文件等
以下是一个 反例,一份包含「函数声明」以及产生「副作用」的代码:
<?php // 「副作用」:修改 ini 配置 ini_set('error_reporting', E_ALL); // 「副作用」:引入文件 include "file.php"; // 「副作用」:生成输出 echo "<html>\n"; // 声明函数 function foo() { // 函数主体部分 }
下面是一个仅包含声明的示例文件;即应提倡的例子:
<?php // 声明 function foo() { // 函数体 } // 条件式声明不算做是副作用 if (! function_exists('bar')) { function bar() { // 函数体 } }
- 命名空间以及类 必须 符合 PSR 的自动加载规范:[PSR-4]() 中的一个;
类的命名必须 遵循
StudlyCaps
大写开头的驼峰命名规范;类的属性命名 可以 遵循:
- 大写开头的驼峰式 ($StudlyCaps)
- 小写开头的驼峰式 ($camelCase)
- 下划线分隔式 ($under_score)
本规范不做强制要求,但无论遵循哪种命名方式,都 应该 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。
类中的常量所有字母都 必须 大写,单词间用下划线分隔;
<?php namespace Vendor\Model; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; }
- 方法名称 必须 符合
camelCase
式的小写开头驼峰命名规范。
编码风格规范
- 代码必须遵守 PSR-1。
- 代码必须使用4个空格来进行缩进,而不是用制表符。
- 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。
- 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。
- 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。
方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。
<?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // 方法主体 } }
所有的属性(property)和方法(method)必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。
<?php namespace Vendor\Package; abstract class ClassName { protected static $foo; abstract protected function zim(); final public static function bar() { // 方法主体部分 } }
- 在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。
- 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。
控制结构的左括号之后不可有空格,右括号之前也不可有空格。
<?php if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; }