概述
PSR 不是PHP官方標準,而是從如Zend、Symfony2等知名PHP項目中提煉出來的一系列標準,目前有愈來愈多的社區項目加入並遵循該標準。php
參考:http://psr.phphub.org/sql
PSR-0 自動加載 X已廢棄
PSR-1 基本代碼規範
PSR-2 代碼樣式
PSR-3 日誌接口
PSR-4 如何指定文件路徑從而自動加載類定義
PSR-1基本代碼規範
本篇規範制定了代碼基本元素的相關標準,以確保共享的PHP代碼間具備較高程度的技術互通性。函數
文件編碼
- PHP代碼文件 必須 以 <?php 或 <?= 標籤開始;
- PHP代碼文件 必須 以 不帶 BOM 的 UTF-8 編碼;
- PHP代碼中 應該 只定義類、函數、常量等聲明,或其餘會產生 反作用 的操做
(如:生成文件輸出以及修改 .ini配置文件等),兩者只能選其一;spa
命名空間與類debug
- 類命名 必須 遵循 StudlyCaps 大寫開頭的駝峯命名規範;
- 每一個類都獨立爲一個文件,且命名空間至少有一個層次:頂級的組織名稱(vendorname)
- 類屬性:小寫開頭駝峯 $studlyCaps
- 類方法:小寫開頭駝峯
常量3d
- 類中的常量全部字母都 必須 大寫,單詞間用下劃線分隔;
- 方法名稱 必須 符合 camelCase 式的小寫開頭駝峯命名規範。
PSR-2編碼風格規範
縮進日誌
- 代碼 必須 使用4個空格符而不是「Tab 鍵」進行縮進。
行代碼規範
- 每行的字符數 應該 軟性保持在 80 個以內,必定不可 多於 120 個,但 必定不可 有硬性限制。
- 全部PHP文件必須以一個空白行做爲結束。
- 每行 必定不可存在多於一條語句 每一個 namespace 命名空間聲明語句和 use 聲明語句塊後面,必須 插入一個空白行。
- 類的開始花括號({) 必須 寫在函數聲明後自成一行,結束花括號(})也 必須寫在函數主體後自成一行。
- 方法的開始花括號({) 必須 寫在函數聲明後自成一行,結束花括號(})也 必須 寫在函數主體後自成一行。
- 控制結構的開始花括號({) 必須 寫在聲明的同一行,而結束花括號(}) 必須 寫在主體後自成一行。
修飾符code
類的屬性和方法 必須 添加訪問修飾符(private、protected 以及 public),abstract 以及final 必須 聲明在訪問修飾符以前,而 static 必須 聲明在訪問修飾符以後。
空格
- 類方法參數每一個逗號後面必需要有一個空格,而逗號前面 必定不可 有空格
- 控制結構的開始左括號後和結束右括號前,都 必定不可 有空格符。
關鍵字
- 控制結構的關鍵字後必需要有一個空格符,而調用方法或函數時則必定不可有。
- PHP全部 關鍵字 必須 所有小寫,常量 true 、false 和 null 也 必須 所有小寫。
PSR-3日誌接口規範
- LoggerInterface 接口對外定義了八個方法,分別用來記錄 RFC 5424 中定義的八個等級的日誌:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。
- 第九個方法 —— log,其第一個參數爲記錄的等級。可以使用一個預先定義的等級常量做爲參數來調用此方法,必須 與直接調用以上八個方法具備相同的效果。
- 若是傳入的等級常量參數沒有預先定義,則 必須 拋出PsrLogInvalidArgumentException 類型的異常。在不肯定的狀況下,使用者 不應 使用未支持的等級常量來調用此方法。
/**
* 日誌等級常量定義
*/
class LogLevel
{
constEMERGENCY='emergency';
constALERT ='alert';
constCRITICAL ='critical';
constERROR ='error';
constWARNING ='warning';
constNOTICE ='notice';
constINFO ='info';
constDEBUG ='debug';
}
PSR-4自動加載規範
相似以下範例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>
- 徹底合規類名必須有一個頂級命名空間(Vendor Name)
- 徹底合規類名能夠有多個子命名空間
- 徹底合規類名應該有一個終止類名
- 下劃線在徹底合規類名中是沒有特殊含義的
- 字母在徹底合規類名中能夠是任何大小寫的組合
- 全部類名必須以大小寫敏感的方式引用
- 終止類名對應一個以 .php 結尾的文件。文件名必須和終止類名大小寫匹配
一些實際商用項目中使用的規範
控制層
- 不出現sql語句(sql封裝到模型層而後做爲方法調用)
- sql語句、3行以上邏輯代碼空行
- 上下文關係函數或方法間不空行
- bool使用if(true === $name)的形式
- 使用雙引號連接變量
- 注意隱式轉換
- 使用全局變量須要註釋其含義,取值範圍:
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
8 函數頭部以下注釋:
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
或者
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
9 註釋間空行:
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
10 文件頭部註釋:
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
或者
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
11 switch語句的case跳轉須要註釋
12 標記變量的命名:
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
13 接口的命名前綴
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
14 狀態碼儘可能使用常量,而不是難以理解的數字
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
15 類文件名使用首大寫駝峯方式,普通文件名使用下劃線方式
16 配置裏的變量名使用下劃線方式