首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP 编码规范,程序员必备,再不怕同事掏枪出来

该 PHP 编码规范基本上是同 PSR 规范的。有一部分的编码规范 PSR 中是建议,此编码规范会强制要求。

此编码规范 是以 PSR-1 / PSR-2 / PSR-2扩展 为蓝本,并增加了相应的细节说明。

基本编码

PHP代码必须使用 长标签 或 短输出标签;一定不可使用其它自定义标签。

PHP代码必须且只可使用不带BOM的UTF-8编码

一份PHP文件中应该要不就只定义新的声明,如类、函数或常量等不产生从属效应的操作,要不就只有会产生从属效应的逻辑操作,但不该同时具有两者“从属效应”(side effects)一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。

“从属效应”包含却不仅限于:生成输出、直接的 require 或 include、连接外部服务、修改 ini 配置、抛出错误或异常、修改全局或静态变量、读或写文件等。

以下是一个错误的例子,一份包含声明以及产生从属效应的代码:

// 从属效应:修改 ini 配置

ini_set('error_reporting', E_ALL);

// 从属效应:引入文件

include"file.php";

// 从属效应:生成输出

echo"\n";

// 声明函数

functionfoo()

{

// 函数主体部分

}

下面是一个范例,一份只包含声明不产生从属效应的代码:

// 声明函数

functionfoo()

{

// 函数主体部分

}

// 条件声明**不**属于从属效应

if(! function_exists('bar')) {

functionbar()

{

// 函数主体部分

}

}

文件

所有PHP文件必须使用Unix LF (linefeed)作为行的结束符。

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

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

行的长度一定不能有硬性的约束。

软性的长度约束限制在120个字符以内

每行不应该多于80个字符,大于80字符的行应该折成多行。

非空行后一定不能有多余的空格符。

空行可以使得阅读代码更加方便以及有助于代码的分块。

每行一定不能存在多于一条语句。

缩进

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

备注: 使用空格而不是tab键缩进的好处在于,

避免在比较代码差异、打补丁、重阅代码以及注释时产生混淆。

并且,使用空格缩进,让对齐变得更方便。

关键字 以及 True/False/Null

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

常量 true 、false 和 null 也必须全部小写。

namespace 以及 use 声明

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

所有 use 必须 在 namespace 后声明。

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

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

例如

namespaceVendor\Package;

useFooClass;

useBarClassasBar;

useOtherVendor\OtherPackage\BazClass;

// ... additional PHP code ...

类、属性和方法

此处的“类”泛指所有的class类、接口以及traits可复用代码块。

类名规则

一个完整的类名需具有以下结构:

\(\)*\

完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";

完整的类名可以有一个或多个子命名空间;

完整的类名必须有一个最终的类名;

完整的类名中任意一部分中的下划线都是没有特殊含义的;

完整的类名可以由任意大小写字母组成;

所有类名都必须是大小写敏感的。

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

类名自动加载规则

当根据完整的类名载入相应的文件

完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;

紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。

末尾的类名必须与对应的以为后缀的文件同名。

自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。

扩展与继承

关键词 extends 和 implements必须写在类名称的同一行。

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

namespaceVendor\Package;

useFooClass;

useBarClassasBar;

useOtherVendor\OtherPackage\BazClass;

classClassNameextendsParentClassimplements\ArrayAccess, \Countable

{

// constants, properties, methods

}

implements 的继承列表也可以分成多行,这样的话,每个继承接口名称都必须分开独立成行,包括第一个。

当需要扩展多个接口时,extends 的相关规范与 4.1 节中 implements 的规范一致。

namespaceVendor\Package;

useFooClass;

useBarClassasBar;

useOtherVendor\OtherPackage\BazClass;

classClassNameextendsParentClassimplements

\ArrayAccess,

\Countable,

\Serializable

{

// constants, properties, methods

}

属性

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

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

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

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

以下是属性声明的一个范例:

namespaceVendor\Package;

classClassName

{

public$foo =null;

}

方法

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

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

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

一个标准的方法声明可参照以下范例,留意其括号、逗号、空格以及花括号的位置。

namespaceVendor\Package;

classClassName

{

publicfunctionfooBarBaz($arg1, &$arg2, $arg3 = [])

{

// method body

}

}

方法的参数

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

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

namespaceVendor\Package;

classClassName

{

publicfunctionfoo($arg1, &$arg2, $arg3 = [])

{

// method body

}

}

abstract 、 final 、 以及 static

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

namespaceVendor\Package;

abstractclassClassName

{

protectedstatic$foo;

abstractprotectedfunctionzim();

finalpublicstaticfunctionbar()

{

// method body

}

}

方法及函数调用

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

bar();

$foo->bar($arg1);

Foo::bar($arg2, $arg3);

参数可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。

$foo->bar(

$longArgument,

$longerArgument,

$muchLongerArgument

);

在参数表中的数组和匿名函数是可以单独分列成多行的。

以下的例子是符合规范的:

somefunction($foo, $bar, [

// ...

], $baz);

$app->get('/hello/',function($name)use($app){

return'Hello '.$app->escape($name);

});

控制结构

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

控制结构关键词后必须有一个空格。

左括号 ( 后一定不能有空格。

右括号 ) 前也一定不能有空格。

右括号 ) 与开始花括号 { 间一定有一个空格。

结构体主体一定要有一次缩进。

结束花括号 } 一定在结构体主体后单独成行。

每个结构体的主体都必须被包含在成对的花括号之中,

这能让结构体更加结构话,以及减少加入新行时,出错的可能性。

if 、 elseif 和 else

标准的 if 结构如下代码所示,留意 括号、空格以及花括号的位置,

注意 else 和 elseif 都与前面的结束花括号在同一行。

if($expr1) {

// if body

}elseif($expr2) {

// elseif body

}else{

// else body;

}

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

switch 和 case

标准的 switch 结构如下代码所示,留意括号、空格以及花括号的位置。

case 语句必须相对 switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须 相对 case 进行一次缩进。

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

switch($expr) {

case:

echo'First case, with a break';

break;

case1:

echo'Second case, which falls through';

// no break

case2:

case3:

case4:

echo'Third case, return instead of break';

return;

default:

echo'Default case';

break;

}

while 和 do while

一个规范的 while 语句应该如下所示,注意其 括号、空格以及花括号的位置。

while($expr) {

// structure body

}

标准的 do while 语句如下所示,同样的,注意其 括号、空格以及花括号的位置。

do{

// structure body;

}while($expr);

for

标准的 for 语句如下所示,注意其 括号、空格以及花括号的位置。

for($i =; $i

// for body

}

foreach

标准的 foreach 语句如下所示,注意其 括号、空格以及花括号的位置。

foreach($iterableas$key => $value) {

// foreach body

}

try, catch

标准的 try catch 语句如下所示,注意其 括号、空格以及花括号的位置。

try{

// try body

}catch(FirstExceptionType $e) {

// catch body

}catch(OtherExceptionType $e) {

// catch body

}

闭包

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

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

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

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

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

标准的闭包声明语句如下所示,注意其 括号、逗号、空格以及花括号的位置。

$closureWithArgs =function($arg1, $arg2){

// body

};

$closureWithArgsAndVars =function($arg1, $arg2)use($var1, $var2){

// body

};

例子

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

namespaceVendor\Package;

useFooInterface;

useBarClassasBar;

useOtherVendor\OtherPackage\BazClass;

classFooextendsBarimplementsFooInterface

{

publicfunctionsampleFunction($a, $b = null)

{

if($a === $b) {

bar();

}elseif($a > $b) {

$foo->bar($arg1);

}else{

BazClass::bar($arg2, $arg3);

}

}

finalpublicstaticfunctionbar()

{

// method body

}

}

以上内容希望帮助到大家,有需要的可以添加下方二维码进群交流学习新技术。

如果你想和PHP大神交流添加微信,拉你入群

如果你想获得精品资料添加微信,送你资源

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190112A0DOPN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券