Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.

Latest commit

 

History

History
246 lines (161 loc) · 7.71 KB

File metadata and controls

246 lines (161 loc) · 7.71 KB

PSR-1 / PSR-2

关于本章

本章节并不是完整介绍PSR-1 / PSR-2, 完整的介绍请看下一节 前置阅读

本章节主要是对一些存在左右为难的规则点,做出个人的解释,希望阅读之后有利于大家遵守规范。

关于修订,如果对规则有异议,可以合理提出,经组委会讨论通过可以修订现有规则。

前置阅读

请务必完成前置阅读

PSR-1 规范

PSR-2 规范

正文

PSR-1与PSR-2

PSR-1内容比较少,只定义了一些最基本的比较硬的规则,基本上违反了PSR-1的话,基本可以确定你写了辣鸡代码。

PSR-2是后来对PSR-1的一个扩展与补充,内容多了很多,管的也比较细,而且没那么硬,都是一些不太影响PHP运行的规则。不过本着写优质代码的愿望,我们希望严格遵守PSR-2规范,甚至是PSR-2明确不做硬性要求的,我们也要尽量想办法遵守。

对于两套规范有重叠的部分,以PSR-2为准。

本文补充:本文会遵守PSR-2规则,部分规则做更严格的处理。

概览


  1. PHP代码文件必须以 <?php 标签开始;

  2. PHP代码中应该只定义类、函数、常量等声明,或其他会产生 从属效应 的操作

     解释:
     就是说,一个php文件,要么定义一个类(最多一个),
     要么定义一堆函数(这个做法已经比较少了),
     要么写一段逻辑。
     
     从属效应是指执行这个文件是会对一些东西产生变化的,
     在这里,定义类和函数式不会有从属效应,但一段逻辑必然产生从属效应。
    
  3. 类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范;

    类中的常量所有字母都必须大写,单词间用下划线分隔;

    类的属性命名、方法名称必须符合 camelCase 式的小写开头驼峰命名规范

     关于大小写的规则没什么好说的,遵守即可。
    
  4. 根据规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称

     解释:
     php5.3以后出来了命名空间,命名空间每一层都用大写字母开头。
     
     注:我们使用的顶级组织名称,一律  \Fyscu
     如  
     \Fyscu\Tools\DbConnection 
     \Fyscu\Log\DailyLog
    
  5. 代码必须使用4个空格符而不是 tab键 进行缩进。

     解释:
     为什么是4空格不是tab,不是2空格。
     其实很简单,php习惯4空格,github上的php源码,90%都是4空格。
     这一点习惯一下就好。
     如果你原来写JS,设置了2空格,要注意切换。
    
  6. 每行的字符数应该软性保持在80个之内, 理论上一定不可多于120个, 但一定不能有硬性限制。

     补充:我们决定这个严格一点,必须限制120个,超长的自己找找原因,想办法解决。
    
  7. 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行。

     解释:
     看例子
     <?php
     namespace \Fyscu\Tools;
     
     use \Fyscu\Log\DailyLog;
     use \Fyscu\Test;
     
     以上,目的就是把namespace语句和use分区域,一目了然。
    
  8. 类的开始花括号{必须写在其声明后自成一行,结束花括号}也必须写在其主体后自成一行。

     主要争议在 { 要不要换行,我们遵循换行原则,
     因为 implement extends这些语句都是跟在类名末尾的,
     有个 { 不方便。(勉强算理由)
    
  9. 方法的开始花括号{必须写在函数声明后自成一行,结束花括号}也必须写在函数主体后自成一行

     同理,php7 以后支持声明返回类型,所以 { 在下一行比较好。
     function foo() :string
     {
     	// php 7
     }
    
  10. 类的属性和方法必须添加访问修饰符(private、protected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后。

    这个基本也是普世规则,按如下规则来
    [abstract/final] public/private/protected [static] function foo();
    
    有约定的顺序有利于大家阅读,请遵守。 
    
  11. 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有

    这个展开讲
    
    控制结构  if while switch之类,关键字后加一个空格
    if (xx)
    while (xx)
    switch (xx)
    
    函数调用,不能加空格
    foo(xx)
    
    应该比较好理解,也是为了区分结构和方法。
    
  12. 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行。

    看例子:
    if (xxx){
    
    }
    while (xx){
    
    }�
    注意类和函数是换行,代码里的不换行。
    
  13. 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。

    就是说 if (xxx), 不能写成 if ( xxx )
    
  14. 所有PHP文件必须以一个空白行作为结束,文件必须省略最后的 ?> 结束标签

    这两个我也不知道怎么解释,大家都遵守就遵守吧
    
  15. PHP所有 关键字必须全部小写。常量 true 、false 和 null 也必须全部小写。

    用 if 而不是 IF,用 null 而不是 NULL,虽然语法不会有问题,但是要统一。
    
  16. 每条语句一定不可定义超过一个属性

    这一条要求我们不能这样写 
    public $a, $b, $c;
    应该分开写成三行。
    
  17. 参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不能有空格

    参数之间有逗号显得不那么拥挤,但要注意逗号的位置。
    public function foo($a, $b, $c);
    
  18. 参数超过3个的函数,考虑按相关度合并成一个参数

    这个有点绕,举个例子
    public function box($width, $height, $length, $color, $isWood);
    可以把长宽高颜色等相关性高的参数合并一下
    public function box($params, $isWood);
    其中
    $params = [
    	'width'=>$width,
    	'height'=>$height,
    	'length'=>$length
    	'color'=>$color
    ];
    
  19. 参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。

    就是说如果你想把参数写成多行,应该每个参数独自一行,如
    foo(
    	$a,
    	$b,
    	$c
    );
    
  20. 应该使用关键词 elseif 代替所有 else if ,以使得所有的控制关键字都像是单独的一个词

    这个厉害了,我也是后来才发现两种写法。
    在这里我们统一用 elseif 。
    
  21. switch以下,case语句缩进一次;case以下,主体及break缩进一次

    switch ($exp) {
    	case '1':
    		//主体
    		break;
    	case '2':
    		break;
    }
    
  22. 闭包声明时,开始花括号必须写在声明的同一行

    这个容易和函数声明混淆,谨记。
    
  23. 如果使用php7,函数必须指明返回类型

    function foo(): string
    {
    	return 'a';
    }
    
  24. 如果使用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);
    	}
    }
    
  25. 运算符与空格

    所有双目运算符,两个操作对象与运算符中间都要有空格,如
    $a + $b;
    $a * $b;
    
    小箭头不能加空格,大箭头两侧加空格
    $obj->name;
    foreach($arr as $key => $value)
    
    三目运算符, ?与 : 两侧都应该加空格
    ($a == $b) ? true : false;
    
    逻辑运算符,两侧加空格
    $b = $a ?? '';
    if ($a && $b)
    
    单目运算符不加空格
    $a++;
    --$b
    
  26. 未完待续