PHP 开发的实践标准:PSR-2

2017-03-09

严格的代码风格

  • 可以使其他的开发者更容易理解你的代码

1 概述

  • 代码必须遵循 “编码风格指南” PSR [ PSR-1 ]。
  • 代码必须使用 4 个空格缩进,而不是 tab 。
  • 每行代码不超过 80 个字符,至少不能超过 120 个字符。
  • namespace 声明后必须空一行 ,use 声明之后,必须空一行。
  • 花括号与圆括号的使用。
  • 类中的每个属性和方法都必须声明可见性,声明为 abstract 或 final ,必须放在可见性关键词之前,声明未 static ,必须放在之后。
  • 控制结构的关键字在他们之后必须有一个空格。

2 详情

贯彻执行[ PSR-1 ]

  • 代码必须遵循“编码风格指南”PSR [ PSR-1 ]。

缩进

  • 使用 4 个空格缩进

使用 table 缩进的不要打架,因为空格可靠,在不同的编辑器中旋显示果基本一致。
有助于避免 diffs,patches,history,annotation 所产生的问题

文件和代码

  • PHP 文件必须使用 UNIX 风格的换行符 (LF) ,并且已空行结束,必须去掉 PHP 关闭标签 ?>。

    必须重视这个问题:前辈们的教训

  • 每行代码不超过 80 个字符,至少不能超过 120 个字符。

  • 每行末尾不能有空格。

关键字

  • PHP 的关键字都应该使用小写字母,例如 true, false, null.

命名空间

  • 每个命名空间声明语句后必须跟着一个空行。类似的,使用 use 关键字导入命名空间或者创建别名时,在一系列声明语句后要加一个空行。
  • 必须有一个 use 关键字表示声明
  • use 声明必须在 namespace 之后。
1
2
3
4
5
6
<?php
namespace Vendor\Package;

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

  • 这里的 class 指的是所有的类,接口,和性状。
  • 类继承和接口必须写在类的同一行
  • 花括号如下使用
1
2
3
4
5
6
7
8
9
10
11
<?php
namespace Vendor\Package;

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

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

方法

  • 方法定义的括号和类一样,方法的参数,括号两边没有空格,每个参数以逗号空格结尾(最后一个除外)。
  • 必须声明可见性
1
2
3
4
5
6
7
8
9
10
<?php
namespace Vendor\Package;

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

可见性

  • 类中的每个属性和方法都必须声明可见性:public, protected, private。
  • 如果把类属性和方法声明为 abstract 或 final ,此限定符必须放在可见性关键词之前
  • 如果把属性和方法声明为 static ,限定符必须放在可见性关键词之后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
namespace Vendor\Package;

abstract class ClassName
{
protected static $foo;

abstract protected function zim();

final public static function bar($iterm, $button)
{
// method body
}
}

控制结构

控制关键字包括:if, elseif, else, switch, case, while, do, while, for, foreach, try, catch。

通用规则如下

  • 控制结构关键字后必须有一个空格
  • 左圆括号之后,右圆口号之前不能有空格
  • 大括号和右圆括号之间有一个空格
  • 该结构体必须进行一次缩进
  • 右大括号必须是在身体上的下一行
1
2
3
4
5
6
7
8
9
10
11
<?php
$car = new \Admin\Car;
$bike = new \Admin\Bike;

if ($car->isPrivate() === true) {
do {
$car->getCarImg();
} while ($bike->isPrivate() === true);

$bike->getBikeImg;
}

闭包(Closures)

  • 闭包声明看起来像下面这样。注意括号,逗号,空格和括号的位置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$closureWithArgs = function ($arg1, $arg2) {
// body
};

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