1. 程式人生 > >PHP PSR 程式碼規範基本介紹

PHP PSR 程式碼規範基本介紹

PSR 是 PHP Standard Recommendation 的簡寫,即PHP推薦標準。

目前通過的規範有 PSR-0(Autoloading Standard)、PSR-1(Basic Coding Standard)、PSR-2(Coding Style Guide)、PSR-3(Logger Interface)、PSR-4(Improved Autoloading)。

PSR 不是PHP官方標準,而是從如Zend、Symfony2等知名PHP專案中提煉出來的一系列標準,目前有越來越多的社群專案加入並遵循該標準。

PHP FIG(Framework Interoperability Group)框架可互用性小組是制定PSR開發規範的組織。他們的目的在於以最低程度的限制制定一個統一的標準,讓各個框架遵循統一的編碼規範。

====================PSR-0(自動載入規範)=======================

PSR-0(Autoloading Standard)類自動載入規範,該規範現已廢棄(Deprecated),它將由PSR-4替代。

1.一個完全合格的名稱空間和類名必須遵循以下結構 “\VendorName\Namespace\ClassName”

2.每個名稱空間必須有頂級的名稱空間 “VendorName”

3.每個名稱空間可以有任意多個子名稱空間

4.每個名稱空間在被檔案系統載入時必須被轉換為作業系統路徑分隔符 (DIRECTORY_SEPARATOR)

5.每個”_”字元在”類名”中被轉換為DIRECTORY_SEPARATOR。而在 PSR-4 中使用下劃線沒有任何特殊含義

6.符合命名標準的名稱空間和類名必須以”.php”結尾來載入檔案

7.名稱空間和類名可以由大小寫字母組成,但必須對大小寫敏感以保證多系統相容性

====================PSR-1(基本程式碼規範)=======================

PSR-1(Basic Coding Standard)基本程式碼規範,用以確保共享的PHP程式碼間具有較高程度的技術互通性。

1.PHP程式碼原始檔必須以 <?php 或 <?= 標籤開始

2.PHP程式碼原始檔必須使用不帶 BOM 的 UTF-8 編碼

3.一個原始檔建議只用作定義類、函式、常量等宣告,或者其他產生從屬效應的操作(如:輸出資訊,修改配置檔案等)

4.名稱空間以及類必須符合 PSR 的自動載入規範:PSR-0 或 PSR-4

5.類的命名必須遵循 StudlyCaps 大寫開頭的駝峰式命名規範

6.類中的常量所有字母都必須大寫,單詞間用下劃線分隔

7.方法名必須符合 camelCase 式的小寫開頭駝峰式命名規範

* BOM(byte order mark)是 Unicode 標準的一部分,通常用於標記純文字位元組序(byte order),使得文字處理程式能夠識別讀入的檔案使用的 Unicode 編碼(UTF-8、UTF-16、UTF-32)。

* 從屬效應是指僅僅通過包含檔案,不直接宣告類、函式和常量而執行的邏輯操作。一份PHP原始檔應該要麼就只包含不產生從屬效應的定義操作,要麼就包含只會產生從屬效應的邏輯操作,切勿同時包含兩者。

====================PSR-2(程式碼風格規範)=======================

 PSR-2(Coding Style Guide)程式碼風格規範,通過制定一系列規範化PHP程式碼的規則,以減少因代作者碼風格不同而造成的閱讀不便。

1.程式碼必須遵循 PSR-1 中的編碼規範

2.程式碼必須使用4個空格來進行縮排,而非製表符(TAB)

3.建議每行程式碼字元數保持在80個以內,理論上不可多於120個,但不做硬性限制

4.每個 namespace 名稱空間語句和 use 宣告語句塊後面必須插入一個空白行

5.類的左花括號 “{” 必須寫在聲明後自成一行,右花括號 “}” 也必須在類主體下自成一行

6.方法的左花括號 “{” 必須放在聲明後自成一行,右花括號 “}” 也必須於主體下自成一行

7.類的屬性和方法必須新增訪問修飾符(private、protected、public),abstract 以及 final 必須宣告在訪問修飾符之前,而 static 必須宣告在訪問修飾符之後(例:final public static)

8.在控制結構關鍵字的後面必須有一個空格,而呼叫方法或函式時一定不能有(控制結構:if-else、switch-case、try-catch、while、foreach …)

9.控制結構的左花括號 “{” 必須跟其處於同一行,右花括號 “}” 必須在控制結構主體之後自成一行

10.控制結構的開始左括號之後,和結束右括號之前都不可以有空格

====================PSR-3(日誌介面規範)=======================

PSR-3(Logger Interface)日誌介面規範,主要目的是為了讓日誌類庫通過接收一個 LoggerInterface 物件來記錄日誌資訊。

1.LoggerInterface 介面對外定義了八個方法,分別用來記錄 RFC 5424 中定義的八個等級的日誌:debug、info、notice、warning、error、critical、alert、emergency

2.第九個方法 log(),第一個引數為記錄等級。可使用一個預先定義的等級常量作為引數來呼叫此方法,必須與直接呼叫以上八個方法具有相同的效果。如果傳入的等級常量沒有預先定義,則必須丟擲 psr\Log\InvalidArgumentException 型別的異常。不推薦使用自定義的日誌等級,除非你非常確定當前類庫對其有所支援。

 ====================PSR-4(自動載入新規)=======================

PSR-4(Improved Autoloading)本規範是關於自動載入對應類的相關規範,是 PSR-0 自動載入規範的補充。

1.此處的“類”是一個泛稱,它包含類、介面、traits 以及其他類似的結構

2.完全限定類名需要遵循以下結構:\<名稱空間>(\<子名稱空間>)*\<類名>

  * 完全限定類名必須要有一個頂級名稱空間,被稱為 “vendor namespace”;

  * 完全限定類名可以有一個或多個子名稱空間;

  * 完全限定類名必須有一個終止類名;

  * 完全限定類名中任意一部分中的下劃線都沒有特殊含義;

  * 完全限定類名可以由任意大小寫字母組成;

  * 完全限定類名必須以大小寫敏感的方式引用;

3.當根據完整的類名載入相應的檔案時:

  * 完全限定類名中,連續的一個或幾個子名稱空間構成的名稱空間字首(不包括頂級名稱空間的分隔符),至少對應著至少一個基礎目錄;

  * 緊接名稱空間字首後的子名稱空間必須與相應的”檔案基目錄“相匹配,其中的名稱空間分隔符將作為目錄分隔符;

  * 終止類名對應一個以 .php 結尾的檔案,檔名必須和終止類名大小寫匹配;

4.自動載入器(autoloader)的實現不能丟擲異常,不可引發任一級別錯誤,也不應該有返回值