[TOC=2]
## 1.概述
* 代碼必須遵循“編碼風格指南”PSR [ PSR-1 ]。
* 代碼必須使用 4 個空格進行縮進,而不是制表符。
* 線路長度不得有硬性限制 ; 軟限制必須是 120 個字符; 線條不應該是 80 個字符或更少。
* `namespace` 聲明后必須有一個空行,并且在聲明塊之后必須有一個空行 `use`。
* 打開類的大括號必須在下一行,并且關閉大括號必須在主體后面的下一行。
* 打開方法的括號必須在下一行,并且關閉括號必須在主體后面的下一行。
* 必須在所有屬性和方法上聲明可見性 ; `abstract`并且 `final` 必須在能見度之前宣布 ; `static `必須在能見度后宣布。
* 控制結構關鍵字必須在它們之后有一個空格 ; 方法和函數調用絕不可以。
* 控制結構的開口括號必須在同一條線上,并且關閉括號必須在主體后面的下一行。
* 控制結構的開括號必須在它們后面沒有空格,并且控制結構的右括號之前不能有空格。
### 1.1 例
此示例包含以下一些規則作為快速概述:
~~~php
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
~~~
## 2.一般
### 2.1 基本編碼標準
* 代碼必須遵循 PSR-1 中列出的所有規則。
### 2.2 檔
* 所有 PHP 文件必須使用 Unix LF(換行)行結尾。
* 所有 PHP 文件必須以一個空行結束。
* `?>` 必須從僅包含 PHP 的文件中省略結束標記。
### 2.3 行
* 線路長度不得有硬性限制。
* 線路長度的軟限制必須是 120 個字符 ; 自動樣式檢查器必須發出警告 , 但絕不能在軟限制上出錯。
* 行不應超過 80 個字符 ; 超過的行應該被分成多個后續行,每行不超過 80 個字符。
* 在非空白行的末尾不得有尾隨空格。
* 可以添加空行以提高可讀性并指示相關的代碼塊。
* 每行不得超過一個語句。
### 2.4 縮進
* 代碼必須使用 4 個空格的縮進,并且不得使用制表符進行縮進。
Nb:僅使用空格,而不是將空格與制表符混合,有助于避免差異,補丁,歷史記錄和注釋的問題 。空間的使用還使得易于插入細粒度的子壓痕用于線間對齊。
### 2.5 關鍵字和真/假/空
* PHP 關鍵字必須是小寫的。
* PHP 的常量 true ,false 以及 null 必須是小寫。
## 3.命名空間和使用聲明
* 如果存在, `namespace` 聲明后必須有一個空行。
* 如果存在,所有 `use` 聲明必須在 `namespace`聲明之后。
* `use` 每個聲明必須有一個關鍵字。
* 在 `use` 塊之后必須有一個空白行。
例如:
~~~php
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// ... additional PHP code ...
~~~
## 4.類,屬性和方法
* 術語“class”指的是所有類,接口和特征。
### 4.1 擴展和實施
* 在 `extends` 和 `implements` 關鍵字必須在同一行中聲明的類名。
* 班級的開口支架必須自成一線; 班級的結束括號必須在身體后面的下一行。
~~~php
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}
~~~
* `implementsMAY` 列表分為多行,每行后續行縮進一次。這樣做時,列表中的第一項必須在下一行,并且每行必須只有一個接口。
~~~php
<?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` 關鍵字不能被用于聲明屬性。
* 每個語句不得超過一個屬性。
* 屬性名稱不應以單個下劃線為前綴,以表示受保護或私有可見性。
屬性聲明如下所示。
~~~php
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
~~~
### 4.3 方法
* 必須在所有方法上聲明可見性。
* 方法名稱不應以單個下劃線為前綴,以指示受保護或私有可見性。
* 方法名稱不得在方法名稱后面用空格聲明。在括弧必須繼續自己的路線,和右括號必須繼續下去了下一行后的身體。在左括號后面不能有空格,并且在右括號之前不能有空格。
方法聲明如下所示。請注意
括號,逗號,空格和大括號的位置:
~~~php
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
~~~
### 4.4 方法參數
* 在參數列表中,每個逗號前不得有空格,每個逗號后必須有一個空格。
* 具有默認值的方法參數必須位于參數列表的末尾。
~~~php
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
~~~
* 參數列表可以分為多行,每行后續行縮進一次。這樣做時,列表中的第一項必須在下一行,并且每行必須只有一個參數。
* 當參數列表分成多行時,右括號和左括號必須放在一起,它們各自之間有一個空格。
~~~php
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
) {
// method body
}
}
~~~
### 4.5 abstract , final , and static
* 如果存在,`abstract` 并 `final` 聲明必須先于知名度聲明。
* 如果存在, `static` 聲明必須在可見性聲明之后。
~~~php
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// method body
}
}
~~~
### 4.6 方法和函數調用
* 在進行方法或函數調用時,方法或函數名稱與左括號之間不能有空格,在左括號后面不能有空格,并且在右括號之前不能有空格。在參數列表中,每個逗號前不得有空格,每個逗號后必須有一個空格。
~~~php
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
~~~
* 參數列表可以分為多行,每行后續行縮進一次。這樣做時,列表中的第一項必須在下一行,并且每行必須只有一個參數。
~~~php
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
~~~
## 5.控制結構
控制結構的一般樣式規則如下:
* 控制結構關鍵字后面必須有一個空格
* 在左括號后面不能有空格
* 在右括號之前不能有空格
* 在右括號和左括號之間必須有一個空格
* 結構體必須縮進一次
* 閉合支撐必須在身體后面的下一行
* 每個結構的主體必須用括號括起來。這標準化了結構的外觀,并減少了在新線被添加到身體時引入錯誤的可能性。
### 5.1 if,elseif,else
if 結構如下所示。注意括號,空格和大括號的位置; 并且else與 早期身體elseif的右大括號位于同一條線上。
~~~php
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
~~~
elseif 該使用關鍵字而不是 else if 所有控件關鍵字看起來像單個單詞。
### 5.2 switch,case
一個 switch 結構如下所示。請注意括號,空格和大括號的位置。的 case 語句必須一次縮進從 switch 和 break 關鍵字(或其它終端關鍵字)必須在相同的水平縮進 case 機構。必須有一個評論,例如
~~~php
// no break在非空case體中有意識地跌倒時。
<?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
<?php
while ($expr) {
// structure body
}
~~~
同樣,do while語句如下所示。請注意括號,空格和大括號的位置。
~~~php
<?php
do {
// structure body;
} while ($expr);
~~~
### 5.4 for
一個 for 聲明如下所示。請注意括號,空格和大括號的位置。
~~~php
<?php
for ($i = 0; $i < 10; $i++) {
// for body
}
~~~
### 5.5 foreach
一個 foreach 聲明如下所示。請注意括號,空格和大括號的位置。
~~~php
<?php
foreach ($iterable as $key => $value) {
// foreach body
}
~~~
### 5.6 try catch
一個 try catch 塊如下所示。請注意括號,空格和大括號的位置。
~~~php
<?php
try {
// try body
} catch (FirstExceptionType $e) {
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
~~~
## 6.關閉
* 閉包必須在 function 關鍵字后面用空格聲明,并在關鍵字前后加一個空格 use。
* 開口支撐必須在同一條線上,并且閉合支撐必須在身體后面的下一行。
* 在參數列表或變量列表的左括號之后不能有空格,并且在參數列表或變量列表的右括號之前不能有空格。
* 在參數列表和變量列表中,每個逗號前不能有空格,每個逗號后必須有一個空格。
* 具有默認值的閉包參數必須位于參數列表的末尾。
閉包聲明如下所示。請注意括號,逗號,空格和大括號的位置:
~~~php
<?php
$closureWithArgs = function ($arg1, $arg2) {
// body
};
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
// body
};
~~~
* 參數列表和變量列表可以分為多行,每行后續行縮進一次。這樣做時,列表中的第一項必須在下一行,并且每行必須只有一個參數或變量。
* 當結束列表(無論是參數還是變量)被分割成多行時,右括號和左括號必須放在一起,并且它們之間有一個空格。
以下是包含和不包含參數列表的閉包的示例,以及跨多行分割的變量列表。
~~~php
<?php
$longArgs_noVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// body
};
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
~~~
>[danger] 請注意,當函數或方法調用中的閉包直接用作參數時,格式設置規則也適用。
~~~php
<?php
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// body
},
$arg3
);
~~~
## 7.結論
* 本指南有意省略了許多風格和實踐元素。這些包括但不限于:
* 全局變量和全局常量的聲明
* 職能宣言
* 運營商和任務
* 線間對齊
* 評論和文檔塊
* 類名前綴和后綴
最佳做法
未來的建議可能會修訂和擴展本指南,以解決風格和實踐中的那些或其他元素。
## 附錄A 調查
在撰寫本風格指南時,該小組對成員項目進行了調查,以確定常見做法。該調查在此保留給后人。
### A.1 調查數據
~~~php
url,http://www.horde.org/apps/horde/docs/CODING_STANDARDS,http://pear.php.net/manual/en/standards.php,http://solarphp.com/manual/appendix-standards.style,http://framework.zend.com/manual/en/coding-standard.html,https://symfony.com/doc/2.0/contributing/code/standards.html,http://www.ppi.io/docs/coding-standards.html,https://github.com/ezsystems/ezp-next/wiki/codingstandards,http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html,https://github.com/UnionOfRAD/lithium/wiki/Spec%3A-Coding,http://drupal.org/coding-standards,http://code.google.com/p/sabredav/,http://area51.phpbb.com/docs/31x/coding-guidelines.html,https://docs.google.com/a/zikula.org/document/edit?authkey=CPCU0Us&hgd=1&id=1fcqb93Sn-hR9c0mkN6m_tyWnmEvoswKBtSc0tKkZmJA,http://www.chisimba.com,n/a,https://github.com/Respect/project-info/blob/master/coding-standards-sample.php,n/a,Object Calisthenics for PHP,http://doc.nette.org/en/coding-standard,http://flow3.typo3.org,https://github.com/propelorm/Propel2/wiki/Coding-Standards,http://developer.joomla.org/coding-standards.html
voting,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,no,?,yes,no,yes
indent_type,4,4,4,4,4,tab,4,tab,tab,2,4,tab,4,4,4,4,4,4,tab,tab,4,tab
line_length_limit_soft,75,75,75,75,no,85,120,120,80,80,80,no,100,80,80,?,?,120,80,120,no,150
line_length_limit_hard,85,85,85,85,no,no,no,no,100,?,no,no,no,100,100,?,120,120,no,no,no,no
class_names,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,lower_under,studly,lower,studly,studly,studly,studly,?,studly,studly,studly
class_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,next,next,next,next,next,next,same,next,next
constant_names,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper
true_false_null,lower,lower,lower,lower,lower,lower,lower,lower,lower,upper,lower,lower,lower,upper,lower,lower,lower,lower,lower,upper,lower,lower
method_names,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,lower_under,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel
method_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,same,next,next,next,next,next,same,next,next
control_brace_line,same,same,same,same,same,same,next,same,same,same,same,next,same,same,next,same,same,same,same,same,same,next
control_space_after,yes,yes,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes
always_use_control_braces,yes,yes,yes,yes,yes,yes,no,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes
else_elseif_line,same,same,same,same,same,same,next,same,same,next,same,next,same,next,next,same,same,same,same,same,same,next
case_break_indent_from_switch,0/1,0/1,0/1,1/2,1/2,1/2,1/2,1/1,1/1,1/2,1/2,1/1,1/2,1/2,1/2,1/2,1/2,1/2,0/1,1/1,1/2,1/2
function_space_after,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no
closing_php_tag_required,no,no,no,no,no,no,no,no,yes,no,no,no,no,yes,no,no,no,no,no,yes,no,no
line_endings,LF,LF,LF,LF,LF,LF,LF,LF,?,LF,?,LF,LF,LF,LF,?,,LF,?,LF,LF,LF
static_or_visibility_first,static,?,static,either,either,either,visibility,visibility,visibility,either,static,either,?,visibility,?,?,either,either,visibility,visibility,static,?
control_space_parens,no,no,no,no,no,no,yes,no,no,no,no,no,no,yes,?,no,no,no,no,no,no,no
blank_line_after_php,no,no,no,no,yes,no,no,no,no,yes,yes,no,no,yes,?,yes,yes,no,yes,no,yes,no
class_method_control_brace,next/next/same,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/next,same/same/same,same/same/same,same/same/same,same/same/same,next/next/next,next/next/same,next/same/same,next/next/next,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/same,next/next/next
~~~
### A2 調查傳奇
1. indent_type:縮進的類型。tab=“使用標簽”,2或4=“空格數”
2. line_length_limit_soft:“軟”行長度限制,以字符為單位。?= 無法辨別或沒有回應,no 意味著沒有限制。
3. line_length_limit_hard:“硬”行長度限制,以字符為單位。?= 無法辨別或沒有回應,no 意味著沒有限制。
4. class_names:如何命名類。lower= 僅小寫,lower_under= 帶下劃線分隔符的小寫,studly = StudlyCase。
5. class_brace_line:一個類的左括號是 same 作為 class 關鍵字 next 在行上還是在它之后的行上?
6. constant_names:類常量如何命名?upper= 帶有下劃線分隔符的大寫。
7. true_false_null:是 true ,false 和 null 關鍵字拼寫為所有的 lower 情況下,或所有 upper 的情況下?
8. method_names:如何命名方法 ?camel = camelCase,lower_under= 帶下劃線分隔符的小寫。
9. method_brace_line:方法的左括號是 same 作為方法名稱還是 next 在行上?
10. control_brace_line:控制結構的開口支撐是 same 在線上還是 next 在線上?
11. control_space_after:控制結構關鍵字后面是否有空格?
12. always_use_control_braces:控制結構總是使用大括號嗎?
13. else_elseif_line:當使用 else 或時 elseif ,它是否 same 作為前一個右大括號上 next 線,還是上線?
14. case_break_indent_from_switch:有多少時間 case 和 break 從開口縮進 switch 聲明?
15. function_space_after:函數調用在函數名后面和左括號之前是否有空格?
16. closing_php_tag_required:在僅包含 PHP 的文件中,是否 `?>` 需要結束標記?
17. line_endings:使用什么類型的行結尾?
18. static_or_visibility_first:當聲明一個方法時,確實 static 是第一個,或者可見性是第一個?
19. control_space_parens:在控制結構表達式中,左括號后面是空格還是右括號前有空格?yes= if ( $expr ),no= if ($expr)。
20. blank_line_after_php:打開 PHP 標記后是否有空行?
21. class_method_control_brace:關于類,方法和控制結構的開頭括號的內容摘要。
### A.3 調查結果
1. indent_type: tab: 7 2: 1 4: 14
2. line_length_limit_soft: ?: 2 no: 3 75: 4 80: 6 85: 1 100: 1 120: 4 150: 1
3. line_length_limit_hard: ?: 2 no: 11 85: 4 100: 3 120: 2
4. class_names: ?: 1 lower: 1 lower_under: 1 studly: 19
5. class_brace_line: next: 16 same: 6
6. constant_names: upper: 22
7. true_false_null: lower: 19 upper: 3
8. method_names: camel: 21 lower_under: 1
9. method_brace_line: next: 15 same: 7
10. control_brace_line: next: 4 same: 18
11. control_space_after: no: 2 yes: 20
12. always_use_control_braces: no: 3 yes: 19
13. else_elseif_line: next: 6 same: 16
14. case_break_indent_from_switch: 0/1: 4 1/1: 4 1/2: 14
15. function_space_after: no: 22
16. closing_php_tag_required: no: 19 yes: 3
17. line_endings: ?: 5 LF: 17
18. static_or_visibility_first: ?: 5 either: 7 static: 4 visibility: 6
19. control_space_parens: ?: 1 no: 19 yes: 2
20. blank_line_after_php: ?: 1 no: 13 yes: 8
21. class_method_control_brace: next/next/next: 4 next/next/same: 11 next/same/same: 1 same/same/same: 6
- 文檔說明
- Java 相關
- 環境配置
- PHP 相關
- 開發規范
- PSR-1: 基本編碼標準
- PSR-2: 編碼風格指南
- PSR-3: 記錄器接口
- PSR-4: 自動加載器
- 部分注解
- 命名空間
- 自動加載
- 環境搭建
- phpstudy
- sublime text3
- Centos6.*
- Centos7.*
- redis 安裝
- 在Linux上安裝NodeJS
- 安裝Crontab UI
- tomcat
- Composer
- 開發優化
- 擴展使用
- Yaconf
- 開發安全
- 經典案例
- 站內信設計
- 微擎相關
- Linux 相關
- 基本常用
- wget
- crontab
- Systemd
- yum
- cat && tac
- kill
- tail
- cat
- vim
- nginx
- 前端相關
- Grid 布局
- Flex 布局
- 雜項
- JS 位運算
- JS 基礎
- Vue
- Axios
- 常用正則
- 命名參考
- sass
- 簡單技巧
- Web Worker
- HTTP
- Content-Type
- 狀態碼
- MySql 相關
- 連接操作
- 用戶相關
- 數據庫表
- 字段操作
- 時間函數
- 文檔解讀
- 命令
- 優化
- 數據庫優化
- 電腦使用
- 系統優化
- 軟件卸載
- 并發優化