PSR是一系列關於PHP開發的規範,分有好幾個版本,本身學的也較爲膚淺,但仍是但願能時常查看規範,爲了方便記憶和遵循,我把關鍵詞爲必須的撿拾出來,作個簡單地必要規範的記錄。(就是個搬磚的。。。)
https://github.com/PizzaLiu/PHP-FIG
http://segmentfault.com/a/1190000002521577php
PSR-0
(已棄用)git
PSR-1
基本代碼規範github
PSR-2
代碼風格規範segmentfault
PSR-2 補充文檔ide
基本代碼規範
PHP代碼文件必以 <?php 或 <?= 標籤開始
;編碼
PHP代碼文件必須以 不帶BOM的 UTF-8 編碼
;spa
命名空間以及類必須符合 PSR 的自動加載規範:PSR-0 或 PSR-4 中的一個
;日誌
類的命名必須遵循 StudlyCaps 大寫開頭的駝峯命名規範
;
類中的常量全部字母都必須大寫
,單詞間用下劃線分隔;
方法名稱
必須符合 camelCase 式的小寫開頭駝峯命名規範
。
PHP代碼必須使用 <?php ?> 長標籤
或 <?= ?> 短輸出標籤
; 必定不可以使用其它自定義標籤。
命名空間以及類的命名必須遵循 PSR-0
.
PHP 5.3及之後版本的代碼必須使用正式的命名空間
。
每一個類都獨立爲一個文件
,且命名空間至少有一個層次
:頂級的組織名稱(vendor name)
代碼風格規範
代碼必須遵循 PSR-1 中的編碼規範 。
代碼必須使用4個空格符而不是 tab鍵 進行縮進
。
備註: 使用空格而不是tab鍵縮進的好處在於, 避免在比較代碼差別、打補丁、重閱代碼以及註釋時產生混淆。 而且,使用空格縮進,讓對齊變得更方便。
每一個 namespace 命名空間聲明語句和 use 聲明語句塊後面
,必須插入一個空白行
。
類的開始花括號({)必須寫在函數聲明後自成一行
,結束花括號(})也必須寫在函數主體後自成一行
。
方法的開始花括號({)必須寫在函數聲明後自成一行
,結束花括號(})也必須寫在函數主體後自成一行
。
類的屬性和方法必須 添加訪問修飾符(private、protected 以及 public)
, abstract 以及 final 必須聲明在訪問修飾符以前
,而 static 必須聲明在訪問修飾符以後
。
控制結構的關鍵字後必需要有一個空格符
,而調用方法或函數時則必定不能有
。
控制結構的開始花括號({)必須寫在聲明的同一行
,而結束花括號(})必須寫在主體後自成一行
。
控制結構的開始左括號後和結束右括號前,都必定不能有空格符
。
全部PHP文件必須使用Unix LF (linefeed)做爲行的結束符
。
全部PHP文件必須以一個空白行做爲結束
。
純PHP代碼文件必須省略最後的 ?> 結束標籤
。
每行必定不能存在多於一條語句
。
非空行後必定不能有多餘的空格符
。
PHP全部 關鍵字必須所有小寫
。
常量 true 、false 和 null 也必須所有小寫
。
日誌接口規範
自動加載規範
一個完整的類名需具備如下結構:
\<命名空間>(\<子命名空間>)*\<類名> 完整的類名必需要有一個頂級命名空間,被稱爲 "vendor namespace"; 完整的類名能夠有一個或多個子命名空間; 完整的類名必須有一個最終的類名; 完整的類名中任意一部分中的下滑線都是沒有特殊含義的; 完整的類名能夠由任意大小寫字母組成; 全部類名都必須是大小寫敏感的。
當根據完整的類名載入相應的文件
完整的類名中,去掉最前面的命名空間分隔符,前面連續的一個或多個命名空間和子命名空間,做爲「命名空間前綴」,其必須與至少一個「文件基目錄」相對應; 緊接命名空間前綴後的子命名空間必須與相應的」文件基目錄「相匹配,其中的命名空間分隔符將做爲目錄分隔符。 末尾的類名必須與對應的以 .php 爲後綴的文件同名。 自動加載器(autoloader)的實現必定不能拋出異常、必定不能觸發任一級別的錯誤信息以及不該該有返回值。
PHP代碼中應該只定義類、函數、常量等聲明,或其餘會產生 從屬效應 的操做(如:生成文件輸出以及修改.ini配置文件等),兩者只能選其一;
類的屬性命名能夠遵循 大寫開頭的駝峯式 ($StudlyCaps)、小寫開頭的駝峯式 ($camelCase) 又或者是 下劃線分隔式 ($under_score),本規範不作強制要求,但不管遵循哪一種命名方式,都應該在必定的範圍內保持一致。
每行的字符數應該軟性保持在80個以內, 理論上必定不可多於120個, 但必定不能有硬性限制。
空行可使得閱讀代碼更加方便以及有助於代碼的分塊。
<?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($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 } }