1. 概览
代码必须遵循 PSR-1 基本代码规范.
代码必须使用四个空格符进行缩进, 而不是一个 tab 键.
每行应该保持在 80 个字符以内, 软限制必须是 120 个字符, 但一定不能有硬性限制.
每个 namespace 命名空间声明语句和 use 声明语句块后面, 必须有一个空白行.
类的开始花括号 ({) 必须写在函数声明后自成一行, 结束花括号 (}) 也必须写在函数主体后自成一行.
方法的开始花括号 ({) 必须写在函数声明后自成一行, 结束花括号 (}) 也必须写在函数主体后自成一行.
在所有的属性和方法上都必须声明可见性(译者注: private,protected 以及 public);abstract 和 final 必须声明在可见性之前; static 必须声明在可见性之后.
控制结构的关键词后面必须有一个空格符, 方法和函数调用一定不能有.
控制结构的开始花括号 ({) 必须写在声明的同一行, 而结束花括号 (}) 必须写在主体后自成一行.
控制结构的开始左括号 ({) 之后一定不能有空格, 右括号 (}) 之前一定不能有空格.
1.1 例子
以下这个例子简单的展示了以上的大部分规范.
- <?php
- namespace Vendor\Package;
- use FooInterface;
- use BarClass as Bar;
- use OtherVerdor\OtherPackage\BazClass;
- class Foo extends Bar implements FooInterface
- {
- public function sampleFunction()
- {
- if ( $a === $b ){
- bar();
- } elseif ( $a> $b ){
- } else {
- }
- }
- }
- ?>
2. 通则
2.1 基本编码规范
代码必须符合 PSR-1 的所有规范
2.2 文件
所有 PHP 文件必须使用 Unix LF (linefeed)作为行的结束符.
所有 PHP 文件必须以一个空白行结束.
纯 PHP 代码文件必须省略最后的 ?> 结束标签.
2.3 行
行的长度一定不能有硬性的约束.
行长度的软性约束一定限制在 120 个字符以内; 如果超过此长度, 代码规范检查器必须发出警告, 一定不能报错.
每行不应该超过 80 个字符; 超过 80 个字符的行, 应该被拆分成多个不超过 80 个字符的后续行.
在非空白行的后面一定不能有多余的空格符.
空行可以用来改善可读性和区分相关的代码块.
每行一定不能多余一条语句.
2.4 缩进
代码必须使用四个空格符缩进, 一定不能使用 tab 键.
2.5 关键字和 True/False/Null
PHP 关键字必须全部小写.
PHP 常量 true,false 和 null 必须全部小写.
3. 命名空间以及 Use 声明
存在命名空间时, 其后面必须有一个空白行.
所有的 use, 必须在命名空间后声明.
每条 use 声明语句, 必须只有一个 use 关键字.
use 声明语句块后面必须有一个空白行.
例如:
- <?php
- namesapce Vendor\Package;
- use FooClass;
- //
4. 类, 属性和方法
此处的 "类" 泛指所有的 class 类, 接口以及 traits 可复用代码块.
4.1 扩展和继承
关键词 extends 和 implements 必须和类名在同一行.
类开始的花括号 ({) 必须独占一行, 类结束的花括号 (}) 必须在类主体后独占一行.
- <?php
- 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
- }
4.2 属性
所有属性都必须声明可见性.
一定不能使用关键字 var 声明一个属性.
每条语句一定不能定义超过一个属性.
属性名称不应该以单个下划线作为前缀来表示属性是 protected 或 private.
一个属性的声明应该像下面这样.
- <?php
- namespace Vendor\Package;
- class ClassName
- {
- public $foo = null;
- }
4.3 方法
所有方法都必须声明可见性(访问修饰符).
方法名称不应该以单个下划线作为前缀来表示是 protected 或 private.
方法名称后一定不能有空格符, 其开始花括号必须独占一行, 结束花括号也必须在方法主体后单独成一行. 参数左括号后和右括号前一定不能有空格.
一个方法定义应该像下面这样, 注意括号, 逗号, 空格和花括号的位置:
- <?php
- namespace Vendor\Package;
- class ClassName
- {
- public function fooBarBaz($arg1, &$arg2, $arg3 = [])
- {
- // method body
- }
- }
4.4 方法参数
在参数列表中, 每个逗号之前一定不能有空格, 每个逗号之后必须有一个空格.
方法参数中, 有默认值的, 必须放到参数列表的末尾.
- <?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
- }
- }
4.5 abstract,final 和 static
当存在时, abstract 和 final 声明必须放在可见性之前.
当存在时, static 声明必须放在可见性后.
- <?php
- namespace Vendor\Package;
- abstract class ClassName
- {
- protected static $foo;
- abstract protected function zim();
- final public static function bar()
- {
- // method body
- }
- }
4.6 方法和函数调用
方法及函数调用时, 方法名或函数名与左括号之间一定不能有空格, 参数右括号前也一定不能有空格. 在参数列表中, 每个逗号之前一定不能有空格, 每个逗号之后必须有一个空格.
- <?php
- bar();
- $foo->bar($arg1);
- Foo::bar($arg2, $arg3);
参数可以被拆分成多个有一个缩进的后续行, 如果这么做, 参数列表中的第一个必须放在下一行, 并且每一行只能有一个参数.
- <?php
- $foo->bar(
- $longArgument,
- $longerArgument,
- $muchLongerArgument
- );
5. 控制结构
控制结构基本样式规范如下:
控制结构关键词后必须有一个空格.
左括号(后面一定不能有空格.
右括号)前一定不能有空格.
右括号)和开始花括号{之间必须有一个空格.
结构体必须缩进一次.
结束花括号}必须在主体后自成一行.
每个结构体的主题都必须被包含在成对的花括号中, 这使结构体看起来更加规范以及减少加入新行时, 出错的可能性..
5.1 if,elseif,else
一个 if 的结构如下所示. 注意其括号, 空格以及花括号的位置, 并且 else 和 elseif 和前一个主体的结束花括号}在同一行.
- <?php
- if ($expr1) {
- // if body
- } elseif ($expr2) {
- // elseif body
- } else {
- // else body;
- }
应该使用 elseif 代替 else if, 使得所有的控制关键词看起来像一个单词.
5.2 switch 和 case
一个 switch 结构如下所示. 注意其括号, 空格以及花括号的位置. case 语句必须相对于 switch 进行一次缩进, break 关键字 (或其他终止关键字) 必须和 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;
- }```
- ### 5.3 while,do while
一个 while 语句如下所示. 注意其括号, 空格以及花括号的位置.
- ```<?php
- while ($expr) {
- // structure body
- }```
同样, 一个 do while 语句如下所示. 注意其括号, 空格以及花括号的位置.
- ```<?php
- do {
- // structure body;
- } while ($expr);```
- ### 5.4 for
一个 for 语句看起来像下面这个样子. 注意其括号, 空格以及花括号的位置.
- <?php
- for ($i = 0; $i <10; $i++) {
- // for body
- }
- ### 5.5 foreach
一个 foreach 语句看起来像下面这样. 注意其括号, 空格以及花括号的位置.
- <?php
- foreach ($iterable as $key => $value) {
- // foreach body
- }
- ### 5.6 try,catch
- <?php
- try {
- // try body
- } catch (FirstExceptionType $e) {
- // catch body
- } catch (OtherExceptionType $e) {
- // catch body
- }```
来源: http://www.bubuko.com/infodetail-2722311.html