PSR是一系列關於php開發的規範,分有好幾個版本,自己學的也較為膚淺,但還是希望能時常查看規範,為了方便記憶和遵循,我把關鍵詞為必須的撿拾出來,做個簡單地必要規範的記錄。(就是個搬磚的。。。) https://github.com/PizzaLiu/PHP-FIG http://segmentfault.com/a/1190000002521577 官方發布檔案版本PSR-0(已棄用) PSR-1 基本代碼規範 PSR-2 代碼風格規範 PSR-2 補充文檔 PSR-3 日誌介面規範 PSR-4 自動載入 PSR-5和PSR-6投票還未通過 必須PSR-1 基本代碼規範php代碼檔案必以 PHP代碼檔案必須以 不帶BOM的 UTF-8 編碼; 命名空間以及類必須符合 PSR 的自動載入規範:PSR-0 或 PSR-4 中的一個; 類的命名必須遵循 StudlyCaps 大寫開頭的駝峰命名規範; 類中的常量所有字母都必須大寫,單詞間用底線分隔; 方法名稱必須符合 camelCase 式的小寫開頭駝峰命名規範。 PHP代碼必須使用 長標籤 或 短輸出標籤; 一定不可使用其它自訂標籤。 命名空間以及類的命名必須遵循 PSR-0. PHP 5.3及以後版本的代碼必須使用正式的命名空間。 每個類都獨立為一個檔案,且命名空間至少有一個層次:頂級的組織名稱(vendor name) PSR-2 代碼風格規範代碼必須遵循 PSR-1 中的編碼規範 。 代碼必須使用4個空格符而不是 tab鍵 進行縮排。 備忘: 使用空格而不是tab鍵縮排的好處在於, 避免在比較代碼差異、打補丁、重閱代碼以及注釋時產生混淆。 並且,使用空格縮排,讓對齊變得更方便。 每個 namespace 命名空間聲明語句和 use 聲明語句塊後面,必須插入一個空白行。 類的開始花括弧({)必須寫在函式宣告後自成一行,結束花括弧(})也必須寫在函數主體後自成一行。 方法的開始花括弧({)必須寫在函式宣告後自成一行,結束花括弧(})也必須寫在函數主體後自成一行。 類的屬性和方法必須 添加存取修飾詞(private、protected 以及 public), abstract 以及 final 必須聲明在存取修飾詞之前,而 static 必須聲明在存取修飾詞之後。 控制結構的關鍵字後必須要有一個空格符,而調用方法或函數時則一定不能有。 控制結構的開始花括弧({)必須寫在聲明的同一行,而結束花括弧(})必須寫在主體後自成一行。 控制結構的開始左括弧後和結束右括弧前,都一定不能有空格符。 所有PHP檔案必須使用Unix LF (linefeed)作為行的結束符。 所有PHP檔案必須以一個空白行作為結束。 純PHP代碼檔案必須省略最後的 ?> 結束標籤。 每行一定不能存在多於一條語句。 非空行後一定不能有多餘的空格符。 PHP所有 關鍵字必須全部小寫。 常量 true 、false 和 null 也必須全部小寫。 PSR-3 日誌介面規範PSR-4 自動載入規範一個完整的類名需具有以下結構:
- \<命名空間>(\<子命名空間>)*\<類名>
- 完整的類名必須要有一個頂級命名空間,被稱為 "vendor namespace";
- 完整的類名可以有一個或多個子命名空間;
- 完整的類名必須有一個最終的類名;
- 完整的類名中任意一部分中的下滑線都是沒有特殊含義的;
- 完整的類名可以由任意大小寫字母組成;
- 所有類名都必須是大小寫敏感的。
複製代碼當根據完整的類名載入相應的檔案
- 完整的類名中,去掉最前面的命名空間分隔字元,前面連續的一個或多個命名空間和子命名空間,作為“命名空間首碼”,其必須與至少一個“檔案基目錄”相對應;
- 緊接命名空間首碼後的子命名空間必須與相應的”檔案基目錄“相匹配,其中的命名空間分隔字元將作為目錄分隔字元。
- 末尾的類名必須與對應的以 .php 為尾碼的檔案同名。
- 自動載入器(autoloader)的實現一定不能拋出異常、一定不能觸發任一層級的錯誤資訊以及不應該有傳回值。
複製代碼建議(更多請查看詳細文檔)PSR-1PHP代碼中應該只定義類、函數、常量等聲明,或其他會產生 從屬效應 的操作(如:組建檔案輸出以及修改.ini設定檔等),二者只能選其一; 類的屬性命名可以遵循 大寫開頭的駝峰式 ($StudlyCaps)、小寫開頭的駝峰式 ($camelCase) 又或者是 底線分隔式 ($under_score),本規範不做強制要求,但無論遵循哪種命名方式,都應該在一定的範圍內保持一致。 PSR-2每行的字元數應該軟性保持在80個之內, 理論上一定不可多於120個, 但一定不能有硬性限制。 空行可以使得閱讀代碼更加方便以及有助於代碼的分塊。 程式碼範例PSR-2
- 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
- }
- }
複製代碼 |