本指南扩展和扩展了基本编码标准PSR-1。
本指南的目的是在扫描来自不同作者的代码时减少认知摩擦。它通过枚举一组共享规则和对如何格式化PHP代码的期望来实现。
这里的风格规则源于各个成员项目之间的共性。当各个作者跨多个项目进行协作时,在所有这些项目中使用一套指南会很有帮助。因此,本指南的好处不在于规则本身,而在于共享这些规则。
本文档中的关键词“必须”,“必须”,“必需”,“应该”,“不应该”,“应该”,“不应该”,“推荐”,“可以”和“可选”按照RFC 2119中的描述进行解释。
1、预览
- 代码必须遵循“编码风格指南”PSR [PSR-1]。
- 代码必须使用4个空格进行缩进,而不是制表符。
- 线路长度不得有硬性限制;软限制必须是120个字符;线条不应该是80个字符或更少。
- 在命名空间声明之后必须有一个空行,并且在使用声明块之后必须有一个空行。
- 打开类的大括号必须在下一行,并且关闭大括号必须在主体后面的下一行。
- 打开方法的括号必须在下一行,并且关闭括号必须在主体后面的下一行。
- 必须在所有属性和方法上声明可见性;必须在可见性之前声明抽象和最终;必须在可见性之后声明static。
- 控制结构关键字必须在它们之后有一个空格;方法和函数调用绝不可以。
- 控制结构的开口括号必须在同一条线上,并且关闭括号必须在主体后面的下一行。
- 控制结构的开括号必须在它们后面没有空格,并且控制结构的右括号之前不能有空格。
1.1 例子
此示例包含以下一些规则作为快速概述:
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($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
}
}
2、通用
2.1 基本编码标准
代码必须遵循PSR-1中列出的所有规则。
2.2 文档
所有PHP文件必须使用Unix LF(换行)行结尾。
所有PHP文件必须以一个空行结束。
必须从仅包含PHP的文件中省略关闭?>标记。
2.3 行
线路长度不得有硬性限制。
线路长度的软限制必须是120个字符;自动样式检查器必须发出警告,但绝不能在软限制上出错。
行不应超过80个字符;超过的行应该被分成多个后续行,每行不超过80个字符。
在非空白行的末尾不得有尾随空格。
可以添加空行以提高可读性并指示相关的代码块。
每行不得超过一个语句。
2.4 缩进
代码必须使用4个空格的缩进,并且不得使用制表符进行缩进。
N.b。:仅使用空格,而不是将空格与制表符混合,有助于避免差异,补丁,历史记录和注释的问题。空间的使用还使得易于插入细粒度的子压痕用于线间对齐。
2.5。关键字和真/假/空
PHP关键字必须是小写的。
PHP常量true,false和null必须是小写的。
3.命名空间和使用声明
如果存在,则在命名空间声明后必须有一个空行。
如果存在,所有使用声明必须在命名空间声明之后。
每个声明必须有一个use关键字。
使用块后必须有一个空行。
例如:
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// ... additional PHP code ...
4、类,属性和方法
4.1 扩展和实施
extends和implements关键字必须在类名称的同一行声明。
班级的开口支架必须自成一线;班级的结束括号必须在身体后面的下一行。
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}
实现列表可以分为多行,每行后续行缩进一次。这样做时,列表中的第一项必须在下一行,并且每行必须只有一个接口。
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// constants, properties, methods
}
4.2 属性
必须在所有属性上声明可见性。
var关键字绝不能用于声明属性。
每个语句不得超过一个属性。
属性名称不应以单个下划线为前缀,以表示受保护或私有可见性。
属性声明如下所示。
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
4.3 方法
必须在所有方法上声明可见性。
方法名称不应以单个下划线为前缀,以指示受保护或私有可见性。
方法名称不得在方法名称后面用空格声明。开口支撑必须单独行,并且闭合支撑必须在身体后面的下一行。在左括号后面不能有空格,并且在右括号之前不能有空格。
方法声明如下所示。请注意括号,逗号,空格和大括号的位置:
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// method body
}
}