目的
为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范。
整体要求
本规范以PSR规范为基础扩展补充制定。 完全遵守PSR-1, PSR-2规范。
规范包命名规范、代码缩进规则、控制结构、函数调用、函数定义、注释、包含代码、PHP标记、文件头的注释块、常量命名等方面的规则。
规范
- 文件
- 源文件 必须 只使用 <?php。
- 源文件中php代码的编码格式 必须 只使用不带BOM的UTF-8。
- 源文件在文件结尾处 必须 忽略掉?>且 必须 以一个空行结尾。
- 类定义文件建议使用类名作为文件名。
- 类文件必须使用命名空间为路径存储。
- 类文件名和类名保存一致,用首字母大写。其他文件全部用小写字母加下划线。
- 基础规范
一个源文件 建议 只用来做声明(类,函数,常量等)或者只用来做一些辅助作用的操作(例如:输出信息,修改.ini配置等),但不应当同时做这两件事。
类名 必须 使用 StudlyCaps 写法,比如SampleController。
类中的常量 必须 只由大写字母和下划线(_)组成。
方法名 必须 使用 camelCase(驼峰式)写法,比如getTotalById。 - 代码规范
代码必须使用4个空格符而不是 tab键 进行缩进。
备注: 使用空格而不是 tab键 缩进的好处在于,
避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。
并且,使用空格缩进,让对齐变得更方便。
关键字 以及 true / false / null
PHP所有 关键字必须全部小写。
常量 true 、false 和 null 也必须全部小写。
每行的字符数应该保持在100个以内, 通常情况不应超过150个。如果换行可能破坏语意或降低可阅读性,可作为例外超出限制。
每个 namespace 命名空间声明语句和 use 声明语句块后面,必须插入一个空白行。所有 use 必须 在 namespace 后声明。每条 use 声明语句 必须 只有一个 use 关键词。use 声明语句块后 必须 要有一个空白行。例如:
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// ... additional PHP code ...
扩展与继承,关键词 extends 和 implements 必须写在类名称的同一行,类的开始花括号必须独占一行,结束花括号也必须在类主体后独占一行。
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}
implements 的继承列表也可以分成多行,这样的话,每个继承接口名称都必须分开独立成行,包括第一个。
<?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
}
类的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
方法的开始花括号({)必须写在函数声明后自成一行,结束花括号(})也必须写在函数主体后自成一行。
一个标准的方法声明可参照以下范例,留意其括号、逗号、空格以及花括号的位置。
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
类的属性和方法必须添加访问修饰符(private、protected 以及 public), abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后。
以下是属性声明的一个范例
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
需要添加 abstract 或 final 声明时, 必须 写在访问修饰符前,而 static 则必须写在其后。
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// method body
}
}
- 控制结构的基本规范如下
控制结构的关键字后 必须 要有一个空格符,而调用方法或函数时则一定不能有。
控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(})必须写在主体后自成一行。
控制结构的开始左括号后和结束右括号前,都一定不能有空格符。
case 语句 必须 相对 switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须 相对 case 进行一次缩进。
如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。例如:
<?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;
}
应该 使用关键词 elseif 代替所有 else if,以使得所有的控制关键字都像是单独的一个词。例如:
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
运算符(=, +, -, *, /, %, +=等等)左右两边 必须要有 一个空格。
参数和变量列表中逗号(,)前 必须不能有 空格,而逗号后 必须要有 空格。
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
参数列表可以分列成多行,这样,包括第一个参数在内的每个参数都 必须 单独成行。
拆分成多行的参数列表后,结束括号以及方法开始花括号 必须 写在同一行,中间用一个空格分隔。
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
) {
// method body
}
}
while 和 do while。一个规范的 while 语句应该如下所示,注意其 括号、空格以及花括号的位置。
<?php
while ($expr) {
// structure body
}
标准的 do while 语句如下所示,同样的,注意其 括号、空格以及花括号的位置。
<?php
do {
// structure body;
} while ($expr);
标准的 for 语句如下所示,注意其括号、空格以及花括号的位置
<?php
for ($i = 0; $i < 10; $i++) {
// for body
}
标准的 foreach语句如下所示,注意其括号、空格以及花括号的位置。例如:
<?php
foreach ($iterable as $key => $value) {
// foreach body
}
标准的 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
};
变量名统一用驼峰命名法。
网友评论