FIG-PHP制定了一系列PHP開發規範,簡稱PSR,這裏FIG是框架互操做工做組(Framework Interoperability Group)的簡稱,PSR是PHP標準推薦(PHP Standard Recommendation)的縮寫。FIG-PHP工做組最初是源於項目表明討論兩個項目之間的共性時,找出能夠共事的方式。主要的受衆是雙方項目組,但PHP界的其餘人也在觀望。若是其餘人願意採用這裏的規範,那麼歡迎,但這並不是工做組的目標。工做組中沒人會告訴你如何來建造應用。php
截止到2015.07, PSR共有五個規範文檔發佈,分別是:html
PSR-0 自動加載(2014.10.21被廢棄,替代規範爲PSR-4)git
PSR-1 基礎編碼規範github
PSR-2 編碼風格web
PSR-3 日誌接口segmentfault
PSR-4 改進的自動加載框架
PSR-7 HTTP消息接口ide
下面將分多個系列來學習這些規範, 本文檔是系列1。函數
2. PSR-1: 基礎編碼規範
學習
本規範討論一些基礎的代碼規範,以便未來代碼共享時不一樣代碼之間能有更高程度的技術互操做。
本規範中的必須(MUST),不可(MUST NOT),應當(SHOULD),不該當(SHOULD NOT),能夠/可能(MAY)等關鍵詞的含義可參見RFC 2119。
源文件必須(MUST)只使用 <?php 和 <?= 這兩種標籤。
源文件中php代碼的編碼格式必須(MUST)只使用不帶字節順序標記(BOM)的UTF-8。備註:更多BOM資料可參見參考資料[BOM]。
一個源文件建議只用來作聲明(類(class),函數(function),常量(constant)等)或者只用來作一些輔助做用的操做(例如:輸出信息,修改.ini配置等),但不該當(SHOULD NOT)同時作這兩件事。
命名空間(namespace)和類(class) 必須遵循一種PSR自動加載規範: PSR-0或PSR-4。(譯者注:因爲PSR-0已經被廢棄,所以這裏事實上等同於必須遵循PSR-4規範。)
類名(class name) 必須使用StudlyCaps寫法。
(譯者注:參見參考資料[StudlyCaps], StudlyCaps是一種大小寫字母可任意變化,其中一些字母可被忽略的一種寫法。例如消息可能隱藏在大寫字母與小寫字母中,例如"ShoEboX"大寫字母可拼出"SEX", 小寫祖母可拼出"hobo", webmail服務商Hotmail最初被寫爲HoTMaiL, 大寫字母可拼出HTML。)
類(class)中的常量必須只由大寫字母和下劃線(_)組成。
方法名(method name) 必須使用camelCase(駝峯式)寫法。
PHP代碼必須只使用長標籤(<?php ?>)或者短輸出式標籤(<?= ?>);而不可以使用其餘標籤。
PHP代碼的編碼格式必須只使用不帶字節順序標記(BOM)的UTF-8。
一個源文件建議只用來作聲明(類(class),函數(function),常量(constant)等)或者只用來作一些輔助做用的操做(例如:輸出信息,修改.ini配置等),但不建議同時作這兩件事。
短語 輔助做用(side effects)的意思是與聲明(類(class),函數(function),常量(constant)等)沒有直接關係的一些執行邏輯。
(譯者注:[PSR-1-翻譯1]中將side effects翻譯爲反作用,[PSR-1-翻譯2]中翻譯爲從屬效應 , 都感受不知所云,這裏翻譯爲輔助做用應當更好)。
(譯者注:原文中的merely from including the file沒有弄清楚是什麼意思,留待之後確認)。
輔助做用包含但不侷限於:產生輸出,顯式地使用require或include,鏈接外部服務,修改ini配置,觸發錯誤或異常,修改全局或者靜態變量,讀取或修改文件等等。
下面是一個既包含聲明又有輔助做用的示例文件;即應避免的例子:
<?php // 輔助做用:修改了ini配置 ini_set('error_reporting', E_ALL); // 輔助做用:載入了文件 include "file.php"; // 輔助做用:產生了輸出 echo "<html>\n"; // 聲明 function foo() { // 函數體 }
下面是一個僅包含聲明的示例文件;即應提倡的例子:
<?php // 聲明 function foo() { // 函數體 } // 條件式聲明不算作是輔助做用 if (! function_exists('bar')) { function bar() { // 函數體 } }
命名空間(namespace)和類(class)必須遵循一種自動加載規範PSR-0或PSR-4.
這意味着一個源文件中只能有一個類(class),而且在命名空間中至少要有一級:即一個頂級的組織名(vendor name)。
類名(class name) 必須使用StudlyCaps寫法。
PHP5.3以後的代碼必須使用正式的命名空間(namespace)
例子:
<?php // PHP 5.3 及以後: namespace Vendor\Model; class Foo { }
PHP5.2.x以前的代碼建議用僞命名空間Vendor_做爲類名(class name)的前綴
<?php // PHP 5.2.x 及以前: class Vendor_Model_Foo { }
術語類(class)指全部的類(class),接口(interface)和trait。
類常量必須(MUST)只由大寫字母和下劃線(_)組成。 例子:
<?php namespace Vendor\Model; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; }
類的屬性命名能夠遵循$StulyCaps,$camelCase或者$under_score中的某一種風格,本規範不作強制要求,但不管遵循哪一種命名方式,都應當(SHOULD)在必定的範圍內保持一致。這個範圍能夠是整個團隊、整個包、整個類或整個方法。
方法名必須(MUST)使用camelCase風格來聲明。
[BOM] 一個bom頭引起的血案, http://blog.csdn.net/ohmygirl/article/details/6931716
[PHP-FIG] php-fig, http://www.php-fig.org/
[PSR-1-翻譯1] PSR-1基本代碼規範, https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-1-basic-coding-standard.md
[PSR-1-翻譯2] PHP PSR-1 基本代碼規範(中文版), http://segmentfault.com/a/1190000002521577
[PSR-4] FIG-PHP PSR規範系列4-自動加載, http://my.oschina.net/1pei/blog/485099
[RFC2119] Key words for use in RFCs to Indicate Requirement Levels, March 1997, http://www.ietf.org/rfc/rfc2119.txt
[RFC2119-阮一峯] RFC2119:表示要求的動詞, http://www.ruanyifeng.com/blog/2007/03/rfc2119.html
[StudlyCaps] Studly caps, https://en.wikipedia.org/wiki/Studly_caps