目前流行的 PHP 先進框架開發者們皆有共識地採用 PSR (PHP Standards Recommendations) 建議規範,以避免重覆造輪子的情況,增加社群活力。例如寫給 Slim 框架用的 PSR-15 中介層 (middleware) 類別,也能套用在 Zend 框架,大大增加物件導向程式設計的優點 - 可複用性 (reuseability)。
是建議規範,不是規定
先前介紹了 PHP 常見的設計模式,可以運用在我們的作品中提高程式碼的品質,但為了讓作品更貼近目前流行的 PHP 框架,筆者建議 PSR 是必須深入認識的。
由於 PSR 是 PHP 社群討論出來的建議規範,要不要採用端看個人。按照 PSR 走的作品在社群接受度會比較高唷。
目錄
目前使用中的規範為:
編號 | 名稱 | 名稱 (中) | 簡介 |
---|---|---|---|
1 | Basic Coding Standard | 基本程式設計規範 | 程式風格的建議,如:排版、命名原則等等。 |
3 | Logger Interface | 日誌記錄程式介面 | 針對日誌記錄程式給出了記錄的訊息級別、方法命名等規範。 |
4 | Autoloading Standard | 自動載入規範 | 針對自動載入程式的設計規範。 |
6 | Caching Interface | 快取介面 | 快取的實作建議。 |
7 | HTTP message interfaces | HTTP 通訊介面 | HTTP 訊息規範於 RFC 7230 及RFC 7231,URL 規範於RFC 3986 的實作建議。 |
11 | Container interface | 容器介面 | 依賴注入容器的規範。 |
12 | Extended Coding Style Guide | 延伸程式設計風格指南 | 對於 PSR-1 的規範不足之處,再補充說明。 |
13 | Hypermedia Links | 超媒體連結 | 連結定義介面。對 PSR-7 中對於超連結的處理做補充。 |
14 | Event Dispatcher | 事件調度程式 | 針對事件調度程式的實作,提供名詞解釋、介面、類別及方法命名等規範。 |
15 | HTTP Handlers | HTTP 處理程式 | HTTP 伺服器端請求處理程式,為 PSR-7 提供了中介層 (middleware) 的實作規範 |
16 | Simple Cache | 簡易快取 | 使用在最簡單的情境,PSR-6 的簡易版封裝。 |
17 | HTTP Factories | HTTP 工廠 | 為 PSR-7 的工廠模式。 |
18 | HTTP Client | HTTP 客戶端 | 客戶端界面的實作規範。 |
在此系列文章中,會介紹的是和「開放源碼的淬練」主題直接相關的。
PSR-1, 12: 程式碼風格
如果程式編寫風格很糟糕,例如這種毛毛蟲寫法:
foreach($news as $k=>$v){
$v["Datum"]=strftime("%d.%m.%Y", strtotime($v["Datum"]));
}
對於排版一點也不講究,唯一的好處是:
「當專案出現 Bug 時,不用 git blame 一眼就可以知道這底誰寫的 @@ 」
這是很不好的好處吧?
一致的程式碼編寫風格,會讓人看了舒服。因此 PRS-1、PSR-12 詳細描述了程式的寫作風格。
PSR-4: 自動載入
我們發佈到 Composer 的套件需要依照 PSR-4 的規範去安排套件的檔案命名、命名空間及類別的命名,以利於 Composer 的自動載入程式在使用 new
關鍵字實例化物件時,自動載入類別所在的檔案 。
PSR-7, 15, 17: HTTP 通訊
如果作品中含有 HTTP 的處理。不採用 PHP 原生的全域變數,例如 $_GET
, $_SERVER
, $_POST
, $_COOKIE
, $_SESSION
。而改採用 PSR-7 ,設計成 PSR-15 的中介層程式,是最佳實踐。如此一來可以讓作品順利在各種不同的 PHP 框架中運作,也才不會發生意外的 bug。
結論
在接下來的三天,筆者會分別介紹:
- 程式碼風格 (PSR-1, 12)
- 自動載入 (PSR-4)
- HTTP 通訊 (PSR-7, 15, 17)
我們明天見囉!
留言