本篇規範是 PSR-1 基本代碼規範的繼承與擴展。php
本規範但願經過制定一系列規範化 PHP 代碼的規則,以減小在瀏覽不一樣做者的代碼時,因代碼風格的不一樣而形成不便。html
當多名程序員在多個項目中合做時,就須要一個共同的編碼規範,
而本文中的風格規範源自於多個不一樣項目代碼風格的共同特性,
所以,本規範的價值在於咱們都遵循這個編碼風格,而不是在於它自己。git
本文件中的 必須
,不得
,須要
,應
,不該
,應該
,不該該
,推薦
,可能
和 可選
等能願動詞按照 RFC 2119 中的描述進行解釋。程序員
代碼 必須 遵循 [PSR-1] 中的編碼規範 。github
代碼 必須 使用 4 個空格符而不是「Tab 鍵」進行縮進。閉包
每行的字符數 應該 軟性保持在 80 個以內,理論上 必定不可 多於 120 個,但 必定不可 有硬性限制。編輯器
每一個 namespace
命名空間聲明語句和 use
聲明語句塊後面,必須 插入一個空白行。函數
類的開始花括號({
) 必須 寫在函數聲明後自成一行,結束花括號(}
)也 必須 寫在函數主體後自成一行。編碼
方法的開始花括號({
) 必須 寫在函數聲明後自成一行,結束花括號(}
)也 必須 寫在函數主體後自成一行。spa
類的屬性和方法 必須 添加訪問修飾符(private
、protected
以及 public
),abstract
以及 final
必須 聲明在訪問修飾符以前,而 static
必須 聲明在訪問修飾符以後。
控制結構的關鍵字後 必須 要有一個空格符,而調用方法或函數時則 必定不可 有。
控制結構的開始花括號({
) 必須 寫在聲明的同一行,而結束花括號(}
) 必須 寫在主體後自成一行。
控制結構的開始左括號後和結束右括號前,都 必定不可 有空格符。
本示例將做爲下文規則的快速概覽:
<?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() { // 方法體 } }
代碼 必須 符合 PSR-1 中的全部規範。
全部 PHP 文件 必須 使用 Unix LF (linefeed)
做爲行的結束符。
全部 PHP 文件 必須 以一個空白行做爲結束。
純 PHP 代碼文件 必須 省略最後的 ?>
結束標籤。
行的長度 必定不可 有硬性的約束。
軟性的長度約束 必須 要限制在 120 個字符之內,若超過此長度,帶代碼規範檢查的編輯器 必須 要發出警告,不過 必定不可 發出錯誤提示。
每行 不應 多於 80 個字符,大於 80 字符的行 應該 折成多行。
非空行後 必定不可 有多餘的空格符。
空行 能夠 使得閱讀代碼更加方便以及有助於代碼的分塊。
每行 必定不可 存在多於一條語句。
代碼 必須 使用 4 個空格來進行縮進, 而且 必定不能 使用 tab
鍵來縮進。
注:僅使用空格,而不是使用空格和
tab
鍵混在一塊兒, 能幫助避免在查看代碼差別,打補丁,查看提交歷史,以及進行註解時產生問題。使用空格也使得代碼對齊更輕鬆。
PHP 的 關鍵字 必須 使用小寫形式。
PHP 的常量 true
, false
, 還有 null
必須 使用小寫形式。
namespace
聲明以後 必須 存在一個空行。
全部的 use
聲明 必須 位於 namespace
聲明以後。
每條 use
聲明 必須 只有一個 use
關鍵字。
use
語句塊以後 必須 存在一個空行。
例如:
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... 其餘 PHP 代碼 ...
此處的「類」泛指全部的「class 類」、「接口」以及「traits 可複用代碼塊」。
關鍵詞 extends
和 implements
必須 寫在類名稱的同一行。
類的開始花括號 必須 獨佔一行,結束花括號也 必須 在類主體後獨佔一行。
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class ClassName extends ParentClass implements \ArrayAccess, \Countable { // 這裏面是常量、屬性、類方法 }
implements
的繼承列表也 能夠 分紅多行,這樣的話,每一個繼承接口名稱都 必須 分開獨立成行,包括第一個。
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class ClassName extends ParentClass implements \ArrayAccess, \Countable, \Serializable { // 這裏面是常量、屬性、類方法 }
每一個屬性都 必須 添加訪問修飾符。
必定不可 使用關鍵字 var
聲明一個屬性。
每條語句 必定不可 定義超過一個屬性。
不應 使用下劃線做爲前綴,來區分屬性是 protected 或 private。
如下是屬性聲明的一個範例:
<?php namespace Vendor\Package; class ClassName { public $foo = null; }
全部方法都 必須 添加訪問修飾符。
不應 使用下劃線做爲前綴,來區分方法是 protected 或 private 訪問修飾符。
方法名稱後 必定不可 有空格符,其開始花括號 必須 獨佔一行,結束花括號也 必須 在方法主體後單獨成一行。參數左括號後和右括號前 必定不可 有空格。
一個標準的方法聲明可參照如下範例,留意其括號、逗號、空格以及花括號的位置。
<?php namespace Vendor\Package; class ClassName { public function fooBarBaz($arg1, &$arg2, $arg3 = []) { // 方法主體 } }
參數列表中,每一個逗號後面 必須 要有一個空格,而逗號前面 必定不可 有空格。
有默認值的參數,必須 放到參數列表的末尾。
<?php namespace Vendor\Package; class ClassName { public function foo($arg1, &$arg2, $arg3 = []) { // 方法主體 } }
參數列表 能夠 分列成多行,這樣,包括第一個參數在內的每一個參數都 必須 單獨成行。
拆分紅多行的參數列表後,結束括號以及方法開始花括號 必須 寫在同一行,中間用一個空格分隔。
<?php namespace Vendor\Package; class ClassName { public function aVeryLongMethodName( ClassTypeHint $arg1, &$arg2, array $arg3 = [] ) { // 方法主體 } }
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() { // 方法主體 } }
方法及函數調用時,方法名或函數名與參數左括號之間 必定不可 有空格,參數右括號前也 必定不可 有空格。每一個逗號前 必定不可 有空格,但其後 必須 有一個空格。
<?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3);
參數 能夠 分列成多行,此時包括第一個參數在內的每一個參數都 必須 單獨成行。
<?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument );
控制結構的基本規範以下:
(
後 必定不可 有空格。)
前也 必定不可 有空格。)
與開始花括號 {
間 必須 有一個空格。}
必須 在結構體主體後單獨成行。每一個結構體的主體都 必須 被包含在成對的花括號之中,
這能讓結構體更加標準化,以及減小加入新行時,出錯的可能性。
if
, elseif
, else
標準的 if
結構以下代碼所示,請留意「括號」、「空格」以及「花括號」的位置,
注意 else
和 elseif
都與前面的結束花括號在同一行。
<?php 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
的註釋。
<?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; }
while
, do while
一個規範的 while
語句應該以下所示,注意其「括號」、「空格」以及「花括號」的位置。
<?php while ($expr) { // 結構體 }
標準的 do while
語句以下所示,一樣的,注意其「括號」、「空格」以及「花括號」的位置。
<?php do { // 結構體 } while ($expr);
for
標準的 for
語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。
<?php for ($i = 0; $i < 10; $i++) { // for 循環主體 }
foreach
標準的 foreach
語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。
<?php foreach ($iterable as $key => $value) { // foreach 主體 }
try
, catch
標準的 try catch
語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。
<?php try { // try 主體 } catch (FirstExceptionType $e) { // catch 主體 } catch (OtherExceptionType $e) { // catch 主體 }
閉包聲明時,關鍵詞 function
後以及關鍵詞 use
的先後都 必須 要有一個空格。
開始花括號 必須 寫在聲明的同一行,結束花括號 必須 緊跟主體結束的下一行。
參數列表和變量列表的左括號後以及右括號前,必定不可 有空格。
參數和變量列表中,逗號前 必定不可 有空格,而逗號後 必須 要有空格。
閉包中有默認值的參數 必須 放到列表的後面。
標準的閉包聲明語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。
<?php $closureWithArgs = function ($arg1, $arg2) { // 主體 }; $closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // 主體 };
參數列表以及變量列表 能夠 分紅多行,這樣,包括第一個在內的每一個參數或變量都 必須 單獨成行,而列表的右括號與閉包的開始花括號 必須 放在同一行。
如下幾個例子,包含了參數和變量列表被分紅多行的多狀況。
<?php $longArgs_noVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) { // 主體 }; $noArgs_longVars = function () use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主體 }; $longArgs_longVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主體 }; $longArgs_shortVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) use ($var1) { // 主體 }; $shortArgs_longVars = function ($arg) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主體 };
注意,閉包被直接用做函數或方法調用的參數時,以上規則仍然適用。
<?php $foo->bar( $arg1, function ($arg2) use ($var1) { // 主體 }, $arg3 );
本指南故意刪除了許多風格與實踐, 它們包括但不限於:
全局變量和常量的聲明
函數聲明
運算符與賦值
行間對齊
註釋與文檔描述塊
類名前綴與後綴
最佳實踐