根据PSR指定的项目代码规范
PHP基本代码规范
本篇参考PSR规范制定了代码基本元素的相关标准
以确保共享的PHP代码间具有较高程度的技术互通性。
1. 文件
1.1 PHP标签
- PHP代码必须使用
<?php ?>
长标签 或 <?= ?>
短输出标签;
- 一定不可使用其它自定义标签。
- 纯PHP代码文件必须省略最后的
?>
结束标签。
1.2 PHP编码
- PHP代码文件必须以
不带BOM的 UTF-8
编码;
1.3 行
- 所有PHP文件必须使用
Unix LF (linefeed)
作为行的结束符。
- 所有PHP文件必须以一个空白行作为结束
- 非空行后一定不能有多余的空格符。
- 空行可以使得阅读代码更加方便以及有助于代码的分块。
- 每行一定不能存在多于一条语句
1.4 缩进
- 代码必须使用4个空格符的缩进,一定不能用 tab键。
备注: 使用空格而不是tab键缩进的好处在于,避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆,并且使用空格缩进,让对齐变得更方便
1.5 关键字 以及 True/False/Null
PHP所有 关键字 必须全部小写。
常量 true
、false
和 null
也必须全部小写
2. namespace 以及 use 声明
namespace
声明后 必须 插入一个空白行。
- 所有
use
必须 在 namespace
后声明。
- 每条
use
声明语句 必须 只有一个 use
关键词。
use
声明语句块后 必须 要有一个空白行。
3. 类、属性和方法
3.1 命名
- 类的命名必须遵循
StudlyCaps
大写开头的驼峰命名规范。
- 方法名称必须符合
camelCase
式的小写开头驼峰命名规范。
- 类中的常量所有字母都必须大写,单词间用下划线分隔。
- 根据规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendor name)。
3.2 结构
- 类的开始花括号(
{
)必须写在函数声明后自成一行,结束花括号(}
)也必须写在函数主体后自成一行。
- 方法的开始花括号(
{
)必须写在函数声明后自成一行,结束花括号(}
)也必须写在函数主体后自成一行。
- 类的属性和方法必须添加访问修饰符(
private
、protected
以及 public
), abstract
以及 final
必须声明在访问修饰符之前,而 static
必须声明在访问修饰符之后。
- 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有。
- 控制结构的开始花括号(
{
)必须写在声明的同一行,而结束花括号(}
)必须写在主体后自成一行。
- 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。
3.3 扩展与继承
- 关键词
extends
和 implements
必须写在类名称的同一行。
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 { }
|
implements
的继承列表也可以分成多行,这样的话,每个继承接口名称都必须分开独立成行,包括第一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php namespace Vendor\Package;
use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable, \Serializable { }
|
3.4 属性
- 每个属性都必须添加访问修饰符。
- 一定不可使用关键字
var
声明一个属性。
- 每条语句一定不可定义超过一个属性。
- 不要使用下划线作为前缀,来区分属性是 protected 或 private。
以下是属性声明的一个范例:
1 2 3 4 5 6 7
| <?php namespace Vendor\Package;
class ClassName { public $foo = null; }
|
3.5 方法及函数调用
- 方法及函数调用时,方法名或函数名与参数左括号之间一定不能有空格,参数右括号前也 一定不能有空格。每个参数前一定不能有空格,但其后必须有一个空格。
1 2 3 4
| <?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3);
|
- 参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。
1 2 3 4 5 6
| <?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument );
|
3.6 流程判读语句
请参考范例
4. 范例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| <?php namespace Vendor\Package;
use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass;
class FooController extends BaseController implements FooInterface //关键词extends和implements写在类名称的同一行, {
public $foo = 'foo'; private $bar = null; public function sampleFunction($a, $b = null)//方法名称符合小写开头驼峰命名规范 { $a = 4; $foo->bar($arg1); Foo::bar($arg2, $arg3);
}
final public static function bar() //类的属性和方法必须添加访问修饰符(`private`、`protected` 以及 `public`) { if ($expr1) { } elseif ($expr2) { } else { }
switch ($expr) { case 0: echo 'First case, with a break'; break; case 1: echo 'Second case, which falls through'; case 2: case 3: case 4: echo 'Third case, return instead of break'; return; default: echo 'Default case'; break; }
while ($expr) { }
do { } while ($expr);
for ($i = 0; $i < 10; $i++) { }
foreach ($iterable as $key => $value) { }
try { } catch (FirstExceptionType $e) { } catch (OtherExceptionType $e) { } }
} ` 结束标签;所有PHP文件必须以一个空白行作为结束
|