PHP编码规范



概述

    本文档为更好的提高工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。
    本规范基于PSR-[0-4]规范,结合团队实际产生。

PSR-1

  1. PHP源文件必须只使用 <?php 和 <?= 这两种标签。
  2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
  3. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
  4. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
  5. 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
  6. 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
  7. 类(class)中的常量必须只由大写字母和下划线(_)组成。
  8. 方法名(method name) 必须使用驼峰式(cameCase)写法。

PSR-2

1. 源文件

  1. 文件末尾必须空一行。
  2. 必须使用Unix LF(换行)作为行结束符。
  3. 纯PHP代码源文件的关闭标签?>必须省略。 这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

2. 缩进

必须使用4个空格来缩进,不能使用Tab键。当然你如果把Tab在编辑器里手动设置为4个空格也可以。

3. 行

一行推荐的是最多写120个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的。

4. 关键字和 True/False/Null

php的关键字,必须小写,boolean值:true,false,null 也必须小写
下面是php的keyword,必须小写。
'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

5. 命名空间(Namespace)和导入(Use)声明

先简单文字描述下:
    1. 命名空间(namespace)的声明后面必须有一行空行。
    2. 所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
    3. 一句声明中,必须只有一个导入(use)关键字。
    4. 在导入(use)声明代码块后面必须有一行空行。
用代码来说明下:
?
1
2
3
4
5
6
7
8
9
10
11
<?php
namespace Lib\Databases; // 下面必须空格一行
use FooInterface; //use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行
class Mysql
{
    //class body
}

6. 类(class),属性(property)和方法(method)

1 . 继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。

?
1
2
3
4
5
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
//换行写{
}
    1.  
2 . 属性(property)必须声明其可见性,到底是 public 还是protected还是 private不能省略,也不能使用var, var是php老版本中的什么方式,等用于public.
?
1
2
3
4
5
6
7
8
9
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public $foo = null;
    private $name = 'yangyi';
    protected $age = '17';
}

3 . 方法(method) ,必须 声明其可见性,到底是 public 还是protected还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间没有空格:function_name($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开。
?
1
2
3
4
5
6
7
8
9
10
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public function getInfo($name, $age, $gender = 1) //函数名getInfo和(之间没有空格,参数之间要有空格。默认参数也要左右都有空格
    { //必须换行写{
         
    }
}

4 . 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。
?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace Vendor\Package;
abstract class ClassName
{
    protected static $foo; //static放后面
    abstract protected function zim(); //abstract放前面
    final public static function bar() //final放前面,static放最后。
    {
        // 方法主体部分
    }
}

7.控制结构

1 . if,elseif,else写法
?
1
2
3
4
5
6
7
8
<?php
if ($expr1) { //左右空格
 // if body
} elseif ($expr2) { //elesif 连着写
 // elseif body
} else {
 // else body;
}

2 . switchcase 注意左右空格和换行
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
switch ($expr) { //左右空格
    case 0:
        echo 'First case, with a break'; //对其
        break; //换行写break ,也对其。
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}

3 . whiledo while 
?
1
2
3
4
5
6
7
<?php
while ($expr) { //左右空格
    // structure body
}
do {
    // structure body; //左右空格
} while ($expr);

4 . for的写法
?
1
2
3
4
<?php
for ($i = 0; $i < 10; $i++) { //注意几个参数之间的空格
    // for body
}

5 . foreach的写法
?
1
2
3
4
<?php
foreach ($iterable as $key => $value) { //还是空格问题
    // foreach body
}
6 . try catch的写法
?
1
2
3
4
5
6
7
8
<?php
try {
    // try body
} catch (FirstExceptionType $e) { //同样也是注意空格。
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

PSR - 3 

PSR-3规范主要是来规范日志接口,这里不再详细叙述,实际工作日志以框架日志接口为准。可参考官网PSR-3规范。

PSR-4

1. 废除了PSR-0中_就是目录分割符的写法,_下划线在完全限定类名中是没有特殊含义了。
2. 类文件名要以 .php 结尾。
3. 类名必须要和对应的文件名要一模一样,大小写也要一模一样。

附录:
PSR 官方网站
PSR 中文站。