首頁 >後端開發 >php教程 >PHP PSR-2 程式碼風格規範

PHP PSR-2 程式碼風格規範

WBOY
WBOY原創
2016-07-23 08:54:441231瀏覽
程式碼風格規範

本篇規範是 [PSR-1][] 基本程式碼規範的繼承與擴充。

本規範希望透過制定一系列規範化php程式碼的規則,以減少在瀏覽不同作者的程式碼時,因程式碼風格的不同而造成不便。

當多名程式設計師在多個專案中合作時,就需要一個共同的編碼規範,
而本文中的風格規範源自於多個不同專案程式碼風格的共同特性,
因此,本規範的價值在於我們都遵循這個編碼風格,而不是在於它本身。

關鍵字「必須」("MUST")、「一定不可/一定不能」("MUST NOT")、「需要」("REQUIRED")、
「將會」("SHALL")、 「不會」("SHALL NOT")、「應該」("SHOULD")、「不該」("SHOULD NOT")、
「推薦」("RECOMMENDED")、「可以」("MAY" )和」可選「("OPTIONAL")的詳細描述可參見[RFC 2119][] 。

概覽


代碼必須遵循 [PSR-1][] 中的編碼規範 。

代碼必須使用4個空格符而不是 tab鍵 進行縮排。

每行的字元數應該軟性保持在80個之內, 理論上一定不可多於120個, 但一定不能有硬性限制。

每個 namespace 命名空間宣告語句和 use 宣告語句區塊後面,必須插入一個空白行。

類別的開始花括號({)必須寫在函數宣告後自成一行,結束花括號(})也必須寫在函數主體後自成一行。

方法的開始花括號({)必須寫在函數宣告後自成一行,結束花括號(})也必須寫在函數主體後自成一行。

類別的屬性和方法必須新增存取修飾符(private、protected 以及public),abstract 以及final 必須宣告在存取修飾符之前,而static 必須宣告在存取修飾符之後。

控制結構的關鍵字後必須要有一個空格符,而呼叫方法或函數時則一定不能有。

控制結構的開始花括號({)必須寫在宣告的同一行,而結束花括號(})必須寫在主體後自成一行。

控制結構的開始左括號後和結束右括號前,都一定不能有空格符。

1.1. 例子

以下範例程式簡單地展示了上述大部分規格:

  1. namespace VendorPackage;
  2. use FooInterface;
  3. use FooInterface;use BarClass as Bar;
  4. use OtherVendorOtherPackageBazClass;
  5. class Foo extends Bar implements FooInterface
  6. {
  7. public function sampleFunction($a, $b = null)
  8. public function sampleFunction($a, $b = null)
  9. if ($a === $b) {
  10. bar();
  11. } elseif ($a > $b) {
  12. $foo->bar($arg1);
  13. } else {
  14. BazClass::bar($arg2, $arg3);
  15. }
  16. }
  17. final public static function bar()
  18. {
  19. // method body
}
}
複製程式碼

通則


2.1 基本編碼準則

代碼必須符合 [PSR-1][] 中的所有規範。

2.2 文件

所有PHP檔案必須使用Unix LF (linefeed)作為行的結束符號。

所有PHP檔案必須以一個空白行作為結束。

純PHP程式碼檔案必須省略最後的 ?> 結束標籤。

2.3. 行

行的長度一定不能有硬性的約束。

軟性的長度約束一定要限制在120個字以內,若超過此長度,帶代碼規範檢查的編輯器一定要發出警告,不過一定不可發出錯誤提示。

每行不應該多於80個字符,大於80字符的行應該折成多行。

非空白行後一定不能有多餘的空格符。

空白行可以使得閱讀程式碼更方便以及有助於程式碼的分塊。

每行一定不能存在多於一條語句。

2.4. 縮排

代碼必須使用4個空格符的縮進,一定不能用 tab鍵 。

備註: 使用空格而不是tab鍵縮排的好處在於,
避免在比較程式碼差異、打補丁、重閱程式碼以及註解時產生混淆。
並且,使用空格縮進,讓對齊變得更方便。

2.5. 關鍵字 以及 True/False/Null

PHP所有 [關鍵字][]必須全部小寫。

常數 true 、false 和 null 也必須全部小寫。

namespace 以及 use 聲明


namespace 宣告後 必須 插入一行空白。

所有 use 必須 在 namespace 後聲明。

每個 use 宣告語句 必須 只有一個 use 關鍵字。

use 宣告語句區塊後 必須 要有一個空白行。

例如:

  1. namespace VendorPackage;
  2. use FooClass;
  3. use BarClass as
  4. use FooClass;
  5. use BarClass as as
// ... additional PHP code ...
複製程式碼


複製程式碼

複製程式碼

類、屬性和方法 此處的「類別」泛指所有的class類別、介面以及traits可重複使用程式碼區塊。 4.1. 擴展與繼承

關鍵字 extends 和 implements
必須
寫在類別名稱的同一行。
  1. 類別的開始花括號
  2. 必須
  3. 獨佔一行,結束花括號也
  4. 必須
  5. 在類主體後面獨佔一行。
  6. namespace VendorPackage;
use FooClass;use BarClass as Bar;use FooClass;
OClass as Barsa>

class ClassName extends ParentClass implements ArrayAccess, Countable{ // constants, properties, methods}

複製程式碼
}
  1. 複製程式碼可以
  2. 分成多行,這樣的話,每個繼承介面名稱都
  3. 必須
  4. 分開獨立成行,包括第一個。
  5. namespace VendorPackage;
  6. use FooClass;
use BarClass as Bar;
use FooClass;OClass as Barsa> class ClassName extends ParentClass implements
ArrayAccess,

Countable, Serializable{

// constants, properties, methods

{ // constants, properties, methods{

// constants, properties, methods

} // constants, properties, methods}

// constants, properties, methods

} // constants, pro>代碼

4.2. 屬性

每個屬性都

必須
新增存取修飾符。
  1. 一定不可
  2. 使用關鍵字 var 宣告一個屬性。
  3. 每個語句
  4. 一定不可
  5. 定義超過一個屬性。
不要使用底線作為前綴,來區分屬性是 protected 或 private。
以下是屬性宣告的範例:

namespace VendorPackage;

class ClassName

{{ public $foo = null;}複製程式碼4.3. 方法

所有方法都

必須

新增存取修飾符。
    不要
  1. 使用底線作為前綴,來區分方法是 protected 或 private。
  2. 方法名稱後
  3. 一定不能
  4. 有空格符,其開始花括號
  5. 必須
  6. 獨佔一行,結束花括號也
  7. 必須
  8. 在方法主體後單獨成一行。參數左括號後面和右括號前
  9. 一定不能
有空格。
一個標準的方法宣告可參考以下範例,留意其括號、逗號、空格以及花括號的位置。 namespace VendorPackage;class ClassName{ public function fooooBarBaz($arg1 $arg3 = []) { // method body }}複製程式碼
4.4. 方法的參數

參數列表中,每個逗號後面必須要有一個空格,而逗號前面一定不能有空格。

有預設值的參數,必須放到參數清單的末端。

  1. namespace VendorPackage;
  2. class ClassName
  3. {
  4. public function foo($arg1, &128($22 $理解可以
  5. 分列成多行,這樣,包括第一個參數在內的每個參數都
  6. 必須
  7. 單獨成行。
拆分成多行的參數清單後,結束括號以及方法開始花括號 必須 寫在同一行,中間用一個空格分隔。

namespace VendorPackage;class ClassName{

public function aVery​​L類, ClassfVer

&$arg2,

array $arg3 = []
) {
// method body
    }
  1. }
  2. 複製程式碼
  3. }
  4. 複製程式碼
  5. }
  6. 複製程式碼
  7. }
複製程式碼}

複製程式碼}

複製程式碼
}
  1. 複製碼
  2. 4.5. abstract 、 final 、 以及static
  3. 需要加入 abstract 或 final 宣告時,
  4. 必須
  5. 寫在存取修飾符前,而 static 則
  6. 必須
  7. 寫在其後。
  8. namespace VendorPackage;
abstract class ClassName
{ protected static; > abstract protected function zim();
final public static function bar()

{ // method body }} }}

程式碼
    4.6. 方法及函數調用
  1. 方法及函數呼叫時,方法名稱或函數名稱與參數左括號之間
  2. 一定不能
  3. 有空格,參數右括號前也
  4. 一定不能
有空格。每個參數前
一定不能有空格,但其後必須
有一個空格。

bar();

$foo->bar($arg1);
Foo::bar($arg2, $ arg3);
  1. 複製程式碼
  2. 參數
  3. 可以
分列成多行,此時包括第一個參數在內的每個參數都
必須單獨成行。


$foo->bar( $longArgument,

$longerArgument, $muchLongerArgument

複製程式碼

控制結構

控制結構的基本規格如下:

控制結構關鍵字後必須有一個空格。

左括號 ( 後一定不能有空格。

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

右括號 ) 與開始花括號 { 間一定有一個空格。

結構體主體

一定
要有一次縮排。

結束花括號 }
一定
    結構體主體後單獨成行。
  1. 每個結構體的主體都
  2. 必須
  3. 被包含在成對的花括號之中,
  4. 這能讓結構體更加結構話,以及減少加入新行時,出錯的可能性。
  5. 5.1. if 、 elseif 和 else
  6. 標準的 if 結構如下程式碼所示,留意 括號、空格以及花括號的位置,
  7. 注意 else 和 elseif 都與前面的結束花括號在同一行。
if ($expr1) { // if body} elseif ($expr2) { // elseif body

} else {
// else body;}

複製程式碼
  1. 應該使用關鍵字🎜>
  2. 應該使用關鍵字🎜>取代所有else if ,以使得所有的控制關鍵字都像是單獨的一個字。
  3. 5.2. switch 和 case
  4. 標準的 switch 結構如下程式碼所示,留意括號、空格以及花括號的位置。
  5. case 語句
  6. 必須
  7. 相對 switch 進行一次縮進,而 break 語句以及 case 內的其它語句都 必須 相對 case 進行一次縮排。
  8. 如果有非空的 case 直穿語句,主體裡必須有類似 // no break 的註解。
  9. switch ($expr) {
  10. 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🎜> echo Third case, return instead of break'; return; default: echo 'Default case'; break;}複製代碼}複製代碼複製代碼 >5.3. while 和 do while

一個規範的 while 語句應該如下所示,注意其 括號、空格、花括號的位置。

  1. while ($expr) {
  2. // structure body
  3. }
複製程式碼複製程式碼
🎜>

標準的do while 語句如下所示,同樣的,注意其括號、空格以及花括號的位置。
  1. do {
  2. // structure body;
} while ($expr);
} while ($expr);

複製程式碼
    5.4. for
  1. 標準的 for 語句如下所示,注意其 括號、空格以及花括號的位置。
for ($i = 0; $i // for body
}

複製程式碼
    5.5. foreach
  1. 標準的 foreach 語句如下所示,注意其 括號、空格、花括號的位置。
foreach ($iterable as $key => $value) { // foreach body
}

複製程式碼
  1. 5.6. try, catch
  2. 標準的 try catch 語句如下所示,注意其 括號、空格、花括號的位置。
  3. try {
// try body
} catch (FirstExceptionType $e) { // catch body // catch body} catch (OtherExceptionType $e) {

// catch body

}

複製程式碼

閉包 閉包聲明時,關鍵字 function 後以及關鍵字 use 的前後都必須

要有一個空格。

開始花括號必須

寫在聲明的同一行,結束花括號

必須緊跟主體結束的下一行。 參數列表和變數列表的左括號後面以及右括號前,必須不能

有空格。

參數和變數清單中,逗號前必須不能

有空格,而逗號後

必須

要有空格。
閉包中有預設值的參數
    必須
  1. 放到清單的後面。
  2. 標準的閉包聲明語句如下所示,注意其 括號、逗號、空格、花括號的位置。
  3. $closureWithArgs = function ($arg1, $arg2) {
// body};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // body};複製代碼

參數列表以及變數列表

可以
分成多行,這樣,包括第一個在內的每個參數或變數都
必須
    單獨成行,而列表的右括號與閉包的開始花括號
  1. 必須
  2. 放在同一行。
  3. 以下幾個例子,包含了參數和變數列表被分成多行的多情況。
  4. $longArgs_noVars = function (
  5. $longArgument,
  6. $longerArgument,
  7. $longArgument,
  8. $longerArgument,
  9. $longArgument,
  10. $longerArgument, // body
  11. };
  12. $noArgs_longVars = function () use (
  13. $longVar1,
  14. $longerVar2,
  15. $muchLongerVar3
  16. $longerVar2,
  17. $muchLongerVar3
  18. //
  19. body
  20. };
  21. $longArgs_longVars = function (
  22. $longArgument,
  23. $longerArgument,
  24. $muchLongerArgument
  25. ) long. longerVar2,
  26. $muchLongerVar3
  27. ) {
  28. // body
  29. };
  30. $longArgs_shortVars = function (
  31. $longArgument, $ muchLongerArgument
  32. ) use ($var1) {
  33. // body
  34. };
$shortArgs_longVars = function ($arg) use (
$longVar1, $muchLongerVar3) {
// body

};

複製程式碼
  1. 注意,閉包直接用作函數或方法呼叫的參數時,以上規則仍然適用。
  2. $foo->bar(
$arg1,
function ($arg2) use ($var1) { // body },
$arg3);複製程式碼

總結


以上規範難免有疏忽,其中包括但不限於:

全域變數與常數的定義

函數的定義

操作符與賦值

行內對齊

註解與文件描述區塊

類別名稱的前綴及後綴

最佳實踐

本規範之後的修訂與擴展將彌補以上不足。

附錄 A. 問卷調查

為了編寫本規範,小組制定了問卷,用來統計各成員項目的共同規範。
以下是此問卷調查的數據,在此供查閱。

A.1. 問卷資料
  1. 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,http://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:-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_tyWnmEvo​​swKBtSc0tKkZmJA,http://www.chisimba.com,n/a,https://github.com/Rex/j/mill/Respec​​ky/5,https://github.com/Respec​​ky/5. 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
  2. voting,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes ,yes,yes,yes,yes,yes,no,no,no,?,yes,no,yes
  3. indent_type,4,4,4,4,4,tab,4,tab,tab,2,4 ,tab,4,4,4,4,4,4,tab,tab,4,tab
  4. line_length_limit_soft,75,75,75,75,no,85,120,120,80,80,80,no,100,80 ,80,?,?,120,80,120,no,150
  5. line_length_limit_hard,85,85,85,85,no,no,no,no,100,?,no,no,no,100,100,?,120,1200,?,no,no,no,100,100,?,120,120,? ,no,no,no,no
  6. class_names,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,lower_under,studly,lower,studly,studly,studly,studly,? ,studly,studly,studly
  7. class_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,next,next,next,next,next,next,same,next,same ,next,next
  8. constant_names,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper ,upper
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. always_use_control_braces,yes,yes,yes
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. line_endings,LF,LF,LF,LF,LF,LF,LF,LF,?,LF ,?,LF,LF,LF,LF,?,,LF,?,LF,LF,LF
  21. static_or_visibility_first,static,?,static,either,either,either,visibility,visibility,visibility,either,static, either,?,visibility,?,?,either,either,visibility,visibility,static,?
  22. control_space_parens,no,no,no,no,no,no,yes,no,no,no,no,no, no,yes,?,no,no,no,no,no,no,no
  23. 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
  24. 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
複製程式碼
A.2. 問卷說明

indent_type:
縮排型. tab = "使用 tab 鍵一次", 2 or 4 = "空格的數量"

line_length_limit_soft:
每行字元數量的「軟」限制. ? = 不可辯護或無回應, no 表示無限制.

line_length_limit_hard:
每行字元數量的「硬」限制. ? = 不可辯護或無作答, no 表示無限制.

class_names:
類別名稱的命名. lower = 只允許小寫字母, lower_under = 下滑線分隔的小寫字母, studly = StudlyCase 的駝峰風格.

class_brace_line:
類別的開始花括號是與 class 關鍵字在同一行或是在其的下一行?

constant_names:
類別的常數如何命名? upper = 底線分隔的大寫字母.

true_false_null:
關鍵字 true、false 以及 null 是全部小寫 lower 還是全部大寫 upper?

method_names:
方法名稱如何命名? camel = camelCase, lower_under = 下劃線分隔的小寫字母.

method_brace_line:
方法的開始花括號是與方法名稱在同一行還是在其的下一行?

control_brace_line:
控制結構的開始花括號是與宣告在同一行還是在其的下一行?

control_space_after:
控制結構關鍵字後是否有空格?

always_use_control_braces:
控制結構體是否都要包含在花括號內?

else_elseif_line:
else 或 elseif 與前面的結束花括號在同一行還是在其的下一行?

case_break_indent_from_switch:
switch 語句中的 case 與 break 需要相對 switch 縮排幾次?

function_space_after:
函數呼叫語句中,函數名稱與變數清單的左括號之間是否有空格?

closing_php_tag_required:
純 PHP 程式碼的文件,是否需要 ?> 結束標籤?

line_endings:
選擇哪一種類型的行結束符號?

static_or_visibility_first:
宣告一個靜態方法時,static 是寫存取修飾符前還是後?

control_space_parens:
控制結構裡,左括號後面、右括號前是否有空格? yes = if ( $expr ), no = if ($expr).

blank_line_after_php:
PHP 開始標籤後,是否需要一個空白行?

class_method_control_brace:
開始花括號在類別、方法和控制結構的位置統計。

A.3. 問卷統計結果
  1. indent_type:
  2. tab: 7
  3. 2: 1
  4. 4: 14
  5. line_length_limit_soft: 🎜
  6. no: 3
  7. 75: 4
  8. 80: 6
  9. 85: 1
  10. 100: 1
  11. 120: 4
  12. 150: 1
  13. 120: 4
  14. 150: 1 ?: 2
  15. no: 11
  16. 85: 4
  17. 100: 3
  18. 120: 2
  19. class_names:
  20. ?: 1
  21. lower: 1 studly: 19
  22. class_brace_line:
  23. 下一個: 19
  24. class_brace_line:
  25. next: 16
  26. same: 6
  27. constant_names:
  28. upper: 22
  29. truestant_names:
  30. upper: 22
  31. true_false_null: 🎜 3
  32. method_names:
  33. camel: 21
  34. lower_under: 1
  35. method_brace_line:
  36. next: 15
  37. same: 7
  38. control_bm> same: 7
  39. control_bee> : 18
  40. control_space_after:
  41. no: 2
  42. yes: 20
  43. always_use_control_braces:
  44. no: 3
  45. yes: 19 ext.> s 3:19 3: 19 3: 19case_break_indent_from_switch:
  46. 0/1: 4
  47. 1/1: 4
  48. 1/2: 14
  49. function_space_after:function_space_after: no: 19
  50. yes: 3
  51. line_endings:
  52. ?: 5
  53. LF: 17
  54. static_or_visibility_first:
  55. ?: 5
  56. either: 7 visibility: 6
  57. control_space_parens:
  58. ?: 1
  59. no: 19
  60. yes: 2
  61. blank_line_after_php:
  62. ?🎜​​> ? : 8
  63. class_method_control_brace:
  64. next/next/next: 4
  65. next/next/same: 11
  66. next/same/same: 1
  67. same/same/ame: 60
  68. 複製程式碼
  69. 轉自Github(PizzaLiu)
PHP, PSR

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn