PHP 代码规范摘记

概览

  • PHP 代码文件必须<?php<?= 标签开始;

  • PHP 代码文件必须不带BOM的 UTF-8 编码;

  • PHP 代码中应该只定义类、函数、常量等声明,或其他会产生 从属效应 的操作(如:生成文件输出以及修改ini配置文件等),二者只能选其一;

  • 类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范;

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

  • 方法名称必须符合 camelCase 式的小写开头驼峰命名规范;

  • 代码必须使用4个空格符而不是 tab键 进行缩进;

  • 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行;

  • 类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行;

  • 方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行;

  • 类的属性和方法必须添加访问修饰符(privateprotected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后;

  • 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有空格符;

  • 控制结构的开始花括号({)必须写在声明的同一行,而结束花括号(})必须写在主体后自成一行;

  • 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。

以下例子程序简单展示了以上大部分规范:

<?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()
    {
        // method body
    }
}

通用规则

1. 文件

所有 PHP 文件必须以一个空白行作为结束;

纯 PHP 代码文件必须省略最后的 ?> 结束标签。

2. 缩进

代码必须使用4个空格符的缩进,一定不能用 tab键 。

备注: 使用空格而不是 tab 键缩进的好处在于避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。

3. 关键字及 True/False/Null

PHP 所有关键字必须全部小写

常量 truefalsenull必须全部小写

namespace 及 use 声明

namespace 声明后必须插入一个空白行;

所有 use 必须namespace 后声明;

每条 use 声明语句必须只有一个 use 关键词;

use 声明语句块后必须要有一个空白行。

示例代码如下:

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

// ... additional PHP code ...

类、属性和方法

注:这里的“类”泛指所有的 class 类、接口和 traits 可复用代码块。

1. 扩展与继承

关键词 extendsimplements必须写在类名称的同一行;

类的开始花括号必须独占一行,结束花括号也必须在类主体后独占一行。

示例代码如下:

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}

2. 属性

每个属性都必须添加访问修饰符;

一定不可使用关键字 var 声明一个属性;

每条语句一定不可定义超过一个属性;

不要使用下划线作为前缀,来区分属性是 protected 或 private。

示例代码如下:

<?php
namespace Vendor\Package;

class ClassName
{
    public $foo = null;
}

3. 方法

所有方法都必须添加访问修饰符;

不要使用下划线作为前缀,来区分方法是 protected 或 private;

方法名称后一定不能有空格符,其开始花括号必须独占一行,结束花括号也必须在方法主体后单独成一行。参数左括号后和右括号前一定不能有空格;

示例代码如下:

<?php
namespace Vendor\Package;

class ClassName
{
    public function fooBarBaz($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}   

4. 方法参数

参数列表中,每个逗号后面必须要有一个空格,而逗号前面一定不能有空格;

有默认值的参数,必须放到参数列表的末尾。

示例代码如下:

<?php
namespace Vendor\Package;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}

5. abstractfinal 以及 static

需要添加 abstractfinal 声明时, 必须写在访问修饰符前,而 static必须写在其后。

示例代码如下:

<?php
namespace Vendor\Package;

abstract class ClassName
{
    protected static $foo;

    abstract protected function zim();

    final public static function bar()
    {
        // method body
    }
}

6. 方法及函数调用

方法及函数调用时,方法名或函数名与参数左括号之间一定不能有空格,参数右括号前也一定不能有空格,每个参数前一定不能有空格,但其后必须有一个空格。

示例代码如下:

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);

控制结构

控制结构的基本规范如下:

  • 控制结构关键词后必须有一个空格;
  • 左括号 (一定不能有空格;
  • 右括号 ) 前也一定不能有空格;
  • 右括号 ) 与开始花括号 {一定有一个空格;
  • 结构体主体一定要有一次缩进;
  • 结束花括号 } 一定在结构体主体后单独成行。

每个结构体的主体都必须被包含在成对的花括号之中,这能让结构体更加结构化,以及减少加入新行时出错的可能性。

1. ifelseifelse

示例代码如下:

<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}

应该使用关键词 elseif 代替所有 else if ,以使得所有的控制关键字都像是单独的一个词。

2. switchcase

示例代码如下:

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a 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;
}

如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。

3. whiledo while

示例代码如下:

<?php
while ($expr) {
    // structure body
}

do {
    // structure body;
} while ($expr);

4. for

示例代码如下:

<?php
for ($i = 0; $i < 10; $i++) {
    // for body
}

5. foreach

示例代码如下:

<?php
foreach ($iterable as $key => $value) {
    // foreach body
}

6. try, catch

示例代码如下:

<?php
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

闭包

声明闭包时关键词 function 后及关键词 use 的前后都必须要有一个空格;

开始花括号必须写在声明的同一行,结束花括号必须紧跟主体结束的下一行;

参数列表和变量列表的左括号后以及右括号前必须不能有空格;

参数和变量列表中,逗号前必须不能有空格,而逗号后必须要有空格;

闭包中有默认值的参数必须放到列表的后面。

示例代码如下:

<?php
$closureWithArgs = function ($arg1, $arg2) {
    // body
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    // body
};

参考资料