PHP开发规范整理
在PHP的开发编码中,现行的规范主要由PHP FIG(Framework Interoperability Group )组织制定。目前表决通过了 6套标准,已经得到大部分PHP框架的支持和认可。
开源规范标准
基础编码规范
-
PHP代码文件必须以不带BOM的UTF-8编码。
-
PHP代码中应该只定义类、函数、常亮等声明,或其他会产生副作用的操作(如:生成文件输出以及以及修改PHP的配置文件),二者只能选其一。
<?php //副作用的反面示例 init_set("error_reporting", E_ALL); include "somefileA.php"; require "somefileB.php"; function starcard() { echo "51starcard\n"; }
<?php //副作用的正面示例 if (!function_exists("starcard")){ function starcard() { echo "51starcard\n"; } } if (!function_exists("jht")){ function jht() { echo "jht\n"; } }
-
类的命名必须遵循大写开头的驼峰命名规范。
-
类中的常量所有字母都必须大写,单词用下划线分隔。
-
方法名称必须遵循小写开头的驼峰命名规范。
<?php class ClassExampleA { const CONST_EXAMPLE = "const_example"; public exampleMethod() { echo "example method\n"; } }
-
代码必须使用4个空格符,而不是TAB键进行缩进。
-
每行代码不该超过80个字符,大于80个字符的应该折成多行,非空行后一定不能有多余的空格,每行一定不能有多条语句。
-
PHP所有的关键字必须全部小写,常量true、false和null也必须小写。
<?php //true, false, null, abstract, private, public... return false;
-
每个namespace名称空间声明语句和use语句块后面,必须插入一个空白行。
-
所有的use必须在namespace后声明,每条use声明语句必须只有1个use关键字。
<?php namespace Istar\Example; use Istar\DemoA; use Istar\DemoB; class DemoC { }
-
类的开始花括号必须独占一行,结束花括号也必须在类主体后独占一行。
-
关键字extends和implements必须写在类名称的同一行,若implements列表分成多行,则每个接口名必须独立成行。
<?php namespace Istar\Package; use FooClass; use BarClass as Bar; class ClassA extends ParentClass implements \ArrayAccess, \Countable { } class ClassB extends ParentClass implements \ArrayClass, \Countable { }
-
方法的开始花括号必须写在方法声明后自成一行,结束花括号也必须写在方法主体后自成一行。
-
类的属性和方法必须添加访问修饰符,abstract和final必须声明在访问修饰符之前,而static必须声明在访问修饰符之后。
-
方法名,属性名不可通过下划线来区分private或public。
-
方法的参数列表中,每个逗号后面必须要有一个空格,而逗号前面则一定不可有空格,有默认值的参数,必须放在参数列表的末尾。
<?php class ClassA { public function methodA($arg1, $arg2, $arg3 = []) { } final public static function methodB() { } }
-
控制结构的关键词后必须有一个空格,左括号后和右括号前一定不可有空格,右括号与开始花括号间必须有一个空格,结束花括号必须在结构体主体后单独成行。
<?php if ($exp1) { //if body } elseif { //elseif body } else { //else body }
<?php switch ($expr) { case 0: echo "case 0"; break; case 1: echo "case 1"; // no return case 2: case 3: case 4: break; default: echo "default"; break; }
<?php while ($expr) { // while body } do { // while body } while ($expr);
<?php for ($i=0; $i < 10; $++) { echo "{$i}\n"; } foreach ($iterable as $key => $value) { echo $key . $value . "\n"; }
<?php try { // body } catch (\Exception $e) { echo $e->getMessage(); }
-
闭包声明时,关键字function和use的前后都必须要有一个空格,开始花括号必须写在声明的同一行,结束花括号必须紧跟主体结束的下一行。
-
闭包中的参数列表规则,同等于一般函数的参数列表规则。
<?php $closureA = function ($arg1, $arg2) { }; $closureB = function ($arg1, $arg2) use ($var1, $var2) { } $closureC = function ( $longArgu1, $longArgu2 ) { }; $closureD = function ( $longArgu1, $longArgu2 ) use ( $longVar1, $longVar2 ){ };
现行系统问题总结
变量名称约定
注释规范
- 注释必须遵循phpDocumentor的规范。
- 类的所有public方法必须添加注释,且注释的内容应该包含参数类型、参数含义和返回值。
- 多余的注释必须删除,其中多余表示的是对于代码阅读无关紧要、代码的注释等。
编码要求
- 除了入口文件处,禁止向全局空间中注册任何函数。
- 不能直接向全局空间中注册类,类必须要属于明确的名称空间。
- 数组的键必须为小写字母,多个单词间用下划线分隔。
- 不得直接实例化任何非服务或公开的类。
- 项目中的所有目录必须有明确的作用和含义,不得存在相同作用或含义的目录。
- 单个文件禁止超过1500行,单个方法禁止超过80行,单个类禁止超过800行。
- 所有的类必须通过composer实现自动加载,不得在代码中直接引入或使用其它方式引入。
- 类和方法的职责必须单一,不允许一个方法或类处理多个不同的业务场景。
- 项目配置文件必须统一在一个目录下,不得分散在多处存储。
- 第三方服务的接入代码和系统自身的业务代码必须切割开,不得混合在一起。
- 禁止直接粘贴复制其它地方的代码,若必须要使用,则和作者商量以服务性代码的形式开放。
- 禁止在除入口文件处,定义全局常量,变量等。
- 所有要使用的变量必须先声明,禁止直接使用未声明的变量。
- ifelse, foreach语句禁止嵌套超过3层,代码中应该减少直接的ifelse嵌套结构。
- 禁止直接使用全局魔术变量,如$_POST,$_GET,$_SERVER等。
- 业务逻辑代码中,禁止直接写html代码。
- 优先使用表单或者post方法提交参数,其次get方法。
- 未使用的局部变量,必须删除。
- 基础的服务性质类应编写单元测试,且单元测试覆盖率必须超过90%。
说明
本规范处于持续更新中。现版本为试行版!