本章节并不是完整介绍PSR-1 / PSR-2, 完整的介绍请看下一节 前置阅读。
本章节主要是对一些存在左右为难的规则点,做出个人的解释,希望阅读之后有利于大家遵守规范。
关于修订,如果对规则有异议,可以合理提出,经组委会讨论通过可以修订现有规则。
请务必完成前置阅读
PSR-1内容比较少,只定义了一些最基本的比较硬的规则,基本上违反了PSR-1的话,基本可以确定你写了辣鸡代码。
PSR-2是后来对PSR-1的一个扩展与补充,内容多了很多,管的也比较细,而且没那么硬,都是一些不太影响PHP运行的规则。不过本着写优质代码的愿望,我们希望严格遵守PSR-2规范,甚至是PSR-2明确不做硬性要求的,我们也要尽量想办法遵守。
对于两套规范有重叠的部分,以PSR-2为准。
本文补充:本文会遵守PSR-2规则,部分规则做更严格的处理。
-
PHP代码文件必须以 <?php 标签开始;
-
PHP代码中应该只定义类、函数、常量等声明,或其他会产生
从属效应的操作解释: 就是说,一个php文件,要么定义一个类(最多一个), 要么定义一堆函数(这个做法已经比较少了), 要么写一段逻辑。 从属效应是指执行这个文件是会对一些东西产生变化的, 在这里,定义类和函数式不会有从属效应,但一段逻辑必然产生从属效应。 -
类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范;
类中的常量所有字母都必须大写,单词间用下划线分隔;
类的属性命名、方法名称必须符合 camelCase 式的小写开头驼峰命名规范
关于大小写的规则没什么好说的,遵守即可。 -
根据规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称
解释: php5.3以后出来了命名空间,命名空间每一层都用大写字母开头。 注:我们使用的顶级组织名称,一律 \Fyscu 如 \Fyscu\Tools\DbConnection \Fyscu\Log\DailyLog -
代码必须使用4个空格符而不是 tab键 进行缩进。
解释: 为什么是4空格不是tab,不是2空格。 其实很简单,php习惯4空格,github上的php源码,90%都是4空格。 这一点习惯一下就好。 如果你原来写JS,设置了2空格,要注意切换。 -
每行的字符数应该软性保持在80个之内, 理论上一定不可多于120个, 但一定不能有硬性限制。
补充:我们决定这个严格一点,必须限制120个,超长的自己找找原因,想办法解决。 -
每个
namespace命名空间声明语句和use声明语句块后面,必须插入一个空白行。解释: 看例子 <?php namespace \Fyscu\Tools; use \Fyscu\Log\DailyLog; use \Fyscu\Test; 以上,目的就是把namespace语句和use分区域,一目了然。 -
类的开始花括号
{必须写在其声明后自成一行,结束花括号}也必须写在其主体后自成一行。主要争议在 { 要不要换行,我们遵循换行原则, 因为 implement extends这些语句都是跟在类名末尾的, 有个 { 不方便。(勉强算理由) -
方法的开始花括号
{必须写在函数声明后自成一行,结束花括号}也必须写在函数主体后自成一行同理,php7 以后支持声明返回类型,所以 { 在下一行比较好。 function foo() :string { // php 7 } -
类的属性和方法必须添加访问修饰符(private、protected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后。
这个基本也是普世规则,按如下规则来 [abstract/final] public/private/protected [static] function foo(); 有约定的顺序有利于大家阅读,请遵守。 -
控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有
这个展开讲 控制结构 if while switch之类,关键字后加一个空格 if (xx) while (xx) switch (xx) 函数调用,不能加空格 foo(xx) 应该比较好理解,也是为了区分结构和方法。 -
控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。
看例子: if (xxx){ } while (xx){ }� 注意类和函数是换行,代码里的不换行。 -
控制结构的开始左括号后和结束右括号前,都一定不能有空格符。
就是说 if (xxx), 不能写成 if ( xxx ) -
所有PHP文件必须以一个空白行作为结束,文件必须省略最后的 ?> 结束标签
这两个我也不知道怎么解释,大家都遵守就遵守吧 -
PHP所有 关键字必须全部小写。常量 true 、false 和 null 也必须全部小写。
用 if 而不是 IF,用 null 而不是 NULL,虽然语法不会有问题,但是要统一。 -
每条语句一定不可定义超过一个属性
这一条要求我们不能这样写 public $a, $b, $c; 应该分开写成三行。 -
参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不能有空格
参数之间有逗号显得不那么拥挤,但要注意逗号的位置。 public function foo($a, $b, $c); -
参数超过3个的函数,考虑按相关度合并成一个参数
这个有点绕,举个例子 public function box($width, $height, $length, $color, $isWood); 可以把长宽高颜色等相关性高的参数合并一下 public function box($params, $isWood); 其中 $params = [ 'width'=>$width, 'height'=>$height, 'length'=>$length 'color'=>$color ]; -
参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。
就是说如果你想把参数写成多行,应该每个参数独自一行,如 foo( $a, $b, $c ); -
应该使用关键词
elseif代替所有else if,以使得所有的控制关键字都像是单独的一个词这个厉害了,我也是后来才发现两种写法。 在这里我们统一用 elseif 。 -
switch以下,case语句缩进一次;case以下,主体及break缩进一次
switch ($exp) { case '1': //主体 break; case '2': break; } -
闭包声明时,开始花括号必须写在声明的同一行
这个容易和函数声明混淆,谨记。 -
如果使用php7,函数必须指明返回类型
function foo(): string { return 'a'; } -
如果使用php7,必须遵守函数返回类型,特殊情况,应该抛出异常
这个理解起来比较深刻,先了解一下 function getRemoteJson(): array { $res = file_get_contents('http://fyscu.com/test.json'); if (!$res) { //出错时不应该返回false,不然不符合函数签名 //抛出异常让上游处理 throw \Exception('json not found'); }else{ return json_decoe($res); } } -
运算符与空格
所有双目运算符,两个操作对象与运算符中间都要有空格,如 $a + $b; $a * $b; 小箭头不能加空格,大箭头两侧加空格 $obj->name; foreach($arr as $key => $value) 三目运算符, ?与 : 两侧都应该加空格 ($a == $b) ? true : false; 逻辑运算符,两侧加空格 $b = $a ?? ''; if ($a && $b) 单目运算符不加空格 $a++; --$b -
未完待续