PHP规范之编程规范,PHP 规范之编程规范

概述

本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便。

当多名程序员在多个项目中合作时,就需要一个共同的编码规范, 而本文中的风格规范源自于多个不同项目代码风格的共同特性, 因此,本规范的价值在于我们都遵循这个编码风格,而不是在于它本身。

本文档的预期读者PHP开发人员。

本文档适用于大型商用项目。

文档截图:

squares.svg

文件夹

文件夹名称必须符合CamelCase式的大写字母开头驼峰命名规范。

文件

PHP代码文件必须以不带BOM的 UTF-8 编码。

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

行的长度一定限制在140个字符以内。

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

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

适当空行可以使得阅读代码更加方便以及有助于代码的分块(但注意不能滥用空行)。

缩进

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

关键字以及 true/false/null

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

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

namespace以及use声明

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

所有use必须在namespace 后声明。

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

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

例如:

namespace VendorgiPackage;

use FooClass;

use BarClass as Bar;

use OtherVendorgiOtherPackageBazClass;

// ... additional PHP code ...

类(class),属性(properties)和方法(methods)

l 这里的类是广义的类,它包含所有的类(classes),接口(interface)和traits;

类(class)

l 类的命名必须遵循大写字母开头的驼峰式命名规范 。

namespace VendorgiPackage;

class ClassName

{

// constants, properties, methods

}

extends 和 implements

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

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

namespace VendorgiPackage;

use FooClass;

use BarClass as Bar;

use OtherVendorgiOtherPackage\BazClass;

class ClassName extends ParentClass implements giArrayAccess, \Countable

{

// constants, properties, methods

}

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

namespace VendorgiPackage;

use FooClass;

use BarClass as Bar;

use OtherVendorgiOtherPackage\BazClass;

class ClassName extends ParentClass implements

giArrayAccess,

giCountable,

giSerializable

{

// constants, properties, methods

}

常量

l 类的常量中所有字母都必须大写,词间以下划线分隔。参照以下代码:

namespace VendorgiPackage;

use FooClass;

use BarClass as Bar;

use OtherVendorgiOtherPackage\BazClass;

class ClassName extends ParentClass implements giArrayAccess, \Countable

{

const VSESION = '1.0';

const SITE_URL = 'http://www.xxx.com ';

}

属性

l 类的属性命名必须遵循小写字母开头的驼峰式命名规范 ($camelCase)。

l 必须对所有属性设置访问控制(如,public,protect,private)。

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

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

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

l 定义属性时先常量属性再变量属性,先public 然后 protected,最后private。

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

namespace VendorgiPackage;

class ClassName

{

const VSESION = '1.0';

public $foo = null;

protected $sex;

private $name;

}

方法

l 方法名称必须符合 camelCase() 式的小写字母开头驼峰命名规范。

l 所有方法都必须设置访问控制(如,public,protect,private)。

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

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

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

namespace VendorgiPackage;

class ClassName

{

public function fooBarBaz($storeName, $storeId, array $info = [])

{

// method body

}

}

方法参数

l 方法参数名称必须符合 camelCase 式的小写字母开头驼峰命名规范

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

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

l 如果参数类型为对像必须指定参数类型为具体的类名,如下的$bazObj参数。

l 如果参数类型为array必须指定参数类型为array。如下$info。

namespace VendorgiPackage;

class ClassName

{

public function foo($storeName, $storeId, BazClass $bazObj, array $info = [])

{

// method body

}

}

l 参数列表超过140个字符可以分列成多行,这样,包括第一个参数在内的每个参数都必须单独成行。

l 拆分成多行的参数列表后,结束括号以及最后一个参数 必须 写在同一行,其开始花括号必须独占一行,结束花括号也必须在方法主体后单独成一行。

namespace VendorgiPackage;

class ClassName

{

public function aVeryLongMethodName(

ClassTypeHint $arg1,

&$arg2,

array $arg3 = [])

{

// method body

}

}

abstract 、 final 、 以及 static

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

namespace VendorgiPackage;

abstract class ClassName

{

protected static $foo;

abstract protected function zim();

final public static function bar()

{

// method body

}

}

方法及方法调用

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

bar();

$foo->bar($arg1);

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

l 参数列表超过140个字符可以分列成多行,此时包括第一个参数在内的每个参数都必须单独成行。

$foo->bar(

$longArgument,

$longerArgument,

$muchLongerArgument);

控制结构(control structures)

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

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

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

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

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

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

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

l 每个结构体的主体都必须被包含在成对的花括号之中, 这能让结构体更加标准,以及减少加入新行时,引入出错的可能性。

if、elseif 和 else

l 标准的 if 结构如下代码所示,留意 括号、空格以及花括号的位置, 注意 else 和 elseif 都与前面的结束花括号在同一行。

if ($expr1) {

// if body

} elseif ($expr2) {

// elseif body

} else {

// else body;

}

//

单个

if

也必须带有花括号

if ($expr1) {

// if body

}

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

switch和 case

l 标准的 switch 结构如下代码所示,留意括号、空格以及花括号的位置。 case 语句必须相对switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须相对 case 进行一次缩进。 如果存在非空的 case 直穿语句,主体里必须有类似 // no break 的注释。

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;

}

while 和 do while

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

while ($expr) {

// structure body

}

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

do {

// structure body;

} while ($expr);

for

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

for ($i = 0; $i < 10; $i++) {

// for body

}

foreach

.1.5. foreach

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

foreach ($iterable as $key => $value) {

// foreach body

}

try catch

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

try {

// try body

} catch (FirstExceptionType $e) {

// catch body

} catch (OtherExceptionType $e) {

// catch body

}

闭包

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

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

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

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

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

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

$closureWithArgs = function ($arg1, $arg2)

{

// body

};

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

{

// body

};

参数列表以及变量列表可以分成多行,这样,包括第一个在内的每个参数或变量都必须单独成行。

以下几个例子,包含了参数和变量列表被分成多行的多情况。

$longArgsNoVars = function (

$longArgument,

$longerArgument,

$muchLongerArgument)

{

// body

};

$noArgsLongVars = function () use (

$longVar1,

$longerVar2,

$muchLongerVar3)

{

// body

};

$longArgsLongVars = function (

$longArgument,

$longerArgument,

$muchLongerArgument

) use (

$longVar1,

$longerVar2,

$muchLongerVar3)

{

// body

};

$longArgsShortVars = function (

$longArgument,

$longerArgument,

$muchLongerArgument

) use ($var1)

{

// body

};

$shortArgsLongVars = function ($arg) use (

$longVar1,

$longerVar2,

$muchLongerVar3

)

{

// body

};

注意,闭包被直接用作函数或方法调用的参数时,以上规则仍然适用。

$foo->bar(

$arg1,

function ($arg2) use ($var1)

{

// body

},

$arg3);

注释

文件注释

l 注释开始 /不可以 /,结束/ 不可以 /。

l 第二行php版本信息,版本信息后一空行。

l 注解内容对齐,注解之间不可有空行。

l 星号和注释内容中间必须是一个空格。

l 保持注解顺序一致@copyright然后 @ link 再 @ license。

类注释

l 注释开始 /不可以 /,结束/ 不可以/。

l 第二行开始描述,描述后一空行。

l 注解内容对齐,注解之间不可有空行。

l 星号和注释内容中间必须是一个空格。

l 保持注解顺序一致@author然后@since再@version。

属性注释

l 注释开始 /不可以 /,结束/ 不可以/。

l 星号和注释内容中间必须是一个空格。

l 使用var注解并注明类型。

l 注解基本类型包括int、sting、array、boolea、具体类名称。

方法注释

l 注释开始 /不可以 /,结束/ 不可以/。

l 第二行开始方法描述,方法描述后一空行。

l 注解内容对齐,注解之间不可有空行。

l 星号和注释内容中间必须是一个空格。

l 注解顺序为@param,@return,@author和@since,参数的顺序必须与方法参数顺序一致。

l 参数和返回值注解包括基本类型(int sting array boolean和unknown)和对象,如果多个可能类型使用|分割。

l 如果参数类型为对像必须指定参数类型为具体的类名,如下的$arg1参数。

l 如果参数类型为array必须指定参数类型为array。如下$arg2。

l 需要作者和日期注解,日期为最后修改日期。

其他注释

l 代码注释尽量使用 //

l 注释内容开始前必须一个空格

l 代码行尾注释//前面必须一个空格

l 代码注释与下面的代码对齐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 1 PHP接口安全 4 1.1 指定公布给外部的资源,客户端只能访问允许访问的资源 4 1.1.1 说明 4 1.1.2 应对 4 1.1.3 举例 4 1.2 定义所有接口的参数,并做严格的检查 5 1.2.1 说明 5 1.2.2 应对 5 1.2.3 举例 5 1.3 不能让客户端看到任何不友好的错误信息 5 1.3.1 说明 5 1.3.2 应对 5 1.3.3 举例 5 二、PHP编码安全 6 2.1 POST/GET参数传值/字符串输入/数据入库等严格的危险字符过滤处理 6 2.1.1 说明 6 2.2.2 应对 6 2.2.3 举例 6 2.2 相关PHP的I/O操作,需要注意限制权限,文件名或目录名或内容都要做好过滤处理 8 2.2.1 说明 8 2.2.2 应对 8 2.2.3 举例 8 2.3 敏感信息(如PASSWORD/银行帐号等)不要依赖COOKIE,SESSION,最好读表,并尽量缓存读表数据 8 2.3.1 说明 8 2.3.2 应对 9 2.3.3 举例 9 2.4 注意对网站根目录及下面所有子目录及文件的权限控制与保护,不要让配置文件/系统信息等文件暴露 10 2.4.1 说明 10 2.4.2 应对 10 2.4.3 举例 10 2.5 屏蔽或定制化出错信息 10 2.5.1 说明 10 2.5.2 应对 11 2.5.3 举例 11 2.6 数据库的读取等操作、POST/GET传值需要做频率限制与Token校验 11 2.6.1 说明 11 2.6.2 应对 11 2.6.3 举例 11 2.7 有类似文件下载/或文本流下载等功能的,尽量避免使用URL直接调用目标文件地址的方式 12 2.7.1 说明 12 2.7.2 应对 12 2.7.3 举例 12 2.8 MYSQL 的用户最好分开,不要用ROOT用户来连接MYSQL 13 2.8.1 说明 13 2.8.2 应对 13 2.8.3 举例 13 3 参考内容 13
java,c/c++,php,c#安全编码规范,从代码层面避免被入侵 1 业务安全编码规范 6 1.1 输入验证和数据合法性校验 6 1.1.1 避免SQL注入 6 1.1.2 避免XML注入 6 1.1.3 避免跨站点脚本(XSS) 7 1.1.4 避免跨站请求伪造(CSRF) 8 1.1.5 避免敏感信息泄露 12 1.2 安全框架 12 1.2.1 Apache Shiro安全框架 12 1.2.2 webSecrity安全框架 13 1.2.3 Enterprise Security API 13 2 基础安全编码规范 15 2.1 声明和初始化 15 2.1.1 避免类初始化的相互依赖 15 2.2 表达式 16 2.2.1 不可忽略方法返回值 16 2.2.2 不要引用空指针 16 2.2.3 使用Arrays.equals()来比较数组的内容 16 2.3 数字类型和操作 17 2.3.1 防止整数溢出 17 2.3.2 避免除法和取模运算分母为零 18 2.4 类和方法操作 18 2.4.1 数据成员声明为私有,提供可访问的包装方法 18 2.4.2 敏感类不允许复制 18 2.4.3 比较类的正确做法 19 2.4.4 不要硬编码敏感信息 19 2.4.5 验证方法参数 19 2.4.6 不要使用过时、陈旧或低效的方法 20 2.4.7 数组引用问题 20 2.4.8 不要产生内存泄露 20 2.5 异常处理 21 2.5.1 不要忽略捕获的异常 21 2.5.2 不允许暴露异常的敏感信息 21 2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 相互依存的任务不要在一个有限的线程池执行 27 2.7 输入输出 27 2.7.1 程序终止前删除临时文件 27 2.7.2 检测和处理文件相关的错误 27 2.7.3 及时释放资源 27 2.8 序列化 28 2.8.1 不要序列化未加密的敏感数据 28 2.8.2 在序列化过程中避免内存和资源泄漏 29 3 其他参考资料 30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值