PSR 是 PHP Standard Recommendations 的簡寫,由?PHP FIG?組織制定的 PHP 規(guī)范迫吐,是 PHP 開發(fā)的實踐標準闲延。
PHP FIG颂翼,F(xiàn)IG 是 Framework Interoperability Group(框架可互用性小組)的縮寫,由幾位開源框架的開發(fā)者成立于 2009 年剥槐,從那開始也選取了很多其他成員進來(包括但不限于?Laravel,?Joomla,?Drupal,?Composer,?Phalcon,?Slim,?Symfony,?Zend Framework?等)唱歧,雖然不是「官方」組織,但也代表了大部分的 PHP 社區(qū)才沧。
項目的目的在于:通過框架作者或者框架的代表之間討論迈喉,以最低程度的限制,制定一個協(xié)作標準温圆,各個框架遵循統(tǒng)一的編碼規(guī)范挨摸,避免各家自行發(fā)展的風格阻礙了 PHP 的發(fā)展,解決這個程序設計師由來已久的困擾岁歉。
目前已表決通過了 6 套標準得运,已經得到大部分 PHP 框架的支持和認可。
==PSR-0(自動加載規(guī)范)==
PSR-0(Autoloading Standard)類自動加載規(guī)范锅移,該規(guī)范現(xiàn)已廢棄(Deprecated)熔掺,它將由PSR-4替代。
1.一個完全合格的命名空間和類名必須遵循以下結構 "\VendorName\Namespace\ClassName"
2.每個命名空間必須有頂級的命名空間 "VendorName"
3.每個命名空間可以有任意多個子命名空間
4.每個命名空間在被文件系統(tǒng)加載時必須被轉換為操作系統(tǒng)路徑分隔符 (DIRECTORY_SEPARATOR)
5.每個"_"字符在"類名"中被轉換為DIRECTORY_SEPARATOR非剃。而在 PSR-4 中使用下劃線沒有任何特殊含義
6.符合命名標準的命名空間和類名必須以".php"結尾來加載文件
7.命名空間和類名可以由大小寫字母組成置逻,但必須對大小寫敏感以保證多系統(tǒng)兼容性
==PSR-1(基本代碼規(guī)范)==
PSR-1(Basic Coding Standard)基本代碼規(guī)范,用以確保共享的PHP代碼間具有較高程度的技術互通性备绽。
1.PHP代碼源文件必須以<?php 或 <?= 標簽開始
2.PHP代碼源文件必須使用不帶 BOM 的 UTF-8 編碼
3.一個源文件建議只用作定義類券坞、函數(shù)鬓催、常量等聲明,或者其他產生從屬效應的操作(如:輸出信息恨锚,修改配置文件等)
4.命名空間以及類必須符合 PSR 的自動加載規(guī)范:PSR-0 或 PSR-4
5.類的命名必須遵循 StudlyCaps 大寫開頭的駝峰式命名規(guī)范
6.類中的常量所有字母都必須大寫宇驾,單詞間用下劃線分隔
7.方法名必須符合 camelCase 式的小寫開頭駝峰式命名規(guī)范
* BOM(byte order mark)是 Unicode 標準的一部分,通常用于標記純文本字節(jié)序(byte order)猴伶,使得文本處理程序能夠識別讀入的文件使用的 Unicode 編碼(UTF-8课舍、UTF-16、UTF-32)他挎。
* 從屬效應是指僅僅通過包含文件筝尾,不直接聲明類、函數(shù)和常量而執(zhí)行的邏輯操作办桨。一份PHP源文件應該要么就只包含不產生從屬效應的定義操作忿等,要么就包含只會產生從屬效應的邏輯操作,切勿同時包含兩者崔挖。
==PSR-2(代碼風格規(guī)范)==
?PSR-2(Coding Style Guide)代碼風格規(guī)范贸街,通過制定一系列規(guī)范化PHP代碼的規(guī)則,以減少因代作者碼風格不同而造成的閱讀不便狸相。
1.代碼必須遵循 PSR-1 中的編碼規(guī)范
2.代碼必須使用4個空格來進行縮進薛匪,而非制表符(TAB)
3.建議每行代碼字符數(shù)保持在80個以內,理論上不可多于120個脓鹃,但不做硬性限制
4.每個 namespace 命名空間語句和 use 聲明語句塊后面必須插入一個空白行
5.類的左花括號 "{" 必須寫在聲明后自成一行逸尖,右花括號 "}" 也必須在類主體下自成一行
6.方法的左花括號 "{" 必須放在聲明后自成一行,右花括號 "}" 也必須于主體下自成一行
7.類的屬性和方法必須添加訪問修飾符(private瘸右、protected娇跟、public),abstract 以及 final 必須聲明在訪問修飾符之前太颤,而 static 必須聲明在訪問修飾符之后(例:final public static)
8.在控制結構關鍵字的后面必須有一個空格苞俘,而調用方法或函數(shù)時一定不能有(控制結構:if-else、switch-case龄章、try-catch吃谣、while、foreach ...)
9.控制結構的左花括號 "{" 必須跟其處于同一行做裙,右花括號 "}" 必須在控制結構主體之后自成一行
10.控制結構的開始左括號之后岗憋,和結束右括號之前都不可以有空格
==PSR-3(日志接口規(guī)范)==
PSR-3(Logger Interface)日志接口規(guī)范,主要目的是為了讓日志類庫通過接收一個 LoggerInterface 對象來記錄日志信息锚贱。
1.LoggerInterface 接口對外定義了八個方法仔戈,分別用來記錄 RFC 5424 中定義的八個等級的日志:debug、info、notice监徘、warning悍缠、error、critical耐量、alert、emergency
2.第九個方法 log()滤港,第一個參數(shù)為記錄等級廊蜒。可使用一個預先定義的等級常量作為參數(shù)來調用此方法溅漾,必須與直接調用以上八個方法具有相同的效果山叮。如果傳入的等級常量沒有預先定義,則必須拋出 psr\Log\InvalidArgumentException 類型的異常添履。不推薦使用自定義的日志等級屁倔,除非你非常確定當前類庫對其有所支持。
==PSR-4(自動加載新規(guī))==
PSR-4(Improved Autoloading)本規(guī)范是關于自動載入對應類的相關規(guī)范暮胧,是 PSR-0 自動加載規(guī)范的補充锐借。
1.此處的“類”是一個泛稱,它包含類往衷、接口钞翔、traits 以及其他類似的結構
2.完全限定類名需要遵循以下結構:\<命名空間>(\<子命名空間>)*\<類名>
* 完全限定類名必須要有一個頂級命名空間,被稱為 "vendor namespace"席舍;
* 完全限定類名可以有一個或多個子命名空間布轿;
* 完全限定類名必須有一個終止類名;
* 完全限定類名中任意一部分中的下劃線都沒有特殊含義来颤;
* 完全限定類名可以由任意大小寫字母組成汰扭;
????* 完全限定類名必須以大小寫敏感的方式引用;
3.當根據(jù)完整的類名載入相應的文件時:
* 完全限定類名中福铅,連續(xù)的一個或幾個子命名空間構成的命名空間前綴(不包括頂級命名空間的分隔符)萝毛,至少對應著至少一個基礎目錄;
? ? ? ?* 緊接命名空間前綴后的子命名空間必須與相應的”文件基目錄“相匹配滑黔,其中的命名空間分隔符將作為目錄分隔符珊泳;
* 終止類名對應一個以 .php 結尾的文件,文件名必須和終止類名大小寫匹配拷沸;
4.自動加載器(autoloader)的實現(xiàn)不能拋出異常色查,不可引發(fā)任一級別錯誤,也不應該有返回值