《現代 PHP》學習筆記(八):PSR-1 & PSR-2

前言

本文為《現代 PHP》一書的學習筆記。

環境

  • Windows 10
  • XAMPP 3.2.2

PHP-FIG

2009 年,數個 PHP 框架的開發者意識到,如何改善框架間溝通以及效率的重要性。為了讓 PHP 框架之間可以共享低耦合度類別來實現資源共享,PHP 需要標準。

這些 PHP 框架的開發者創立了 PHP Framework Interoperability Group(PHP-FIG),目的是「找出專案中的共通性並且找到一個可以共事的方法」。

框架互通性

PHP-FIG 的任務是框架的互通性,框架互通性表示框架之間藉由介面、自動載入和風格來合作。

自動載入

PHP 框架藉由自動載入來合作,自動載入是個執行時期的程序,PHP 類別在有需要時被 PHP 直譯器自動定位並載入。

風格

程式碼風格決定了空格、大小寫以及括號的擺放位置,標準的程式碼風格幫助所有的團隊成員迅速了解同一個程式庫,無論其原先的作者是誰。

PSR

PSR 是 PHP Standards Recommendations 的縮寫。

PHP-FIG 至少已經通過 6 套標準:

  1. PSR-1:基本程式碼風格
  2. PSR-2:嚴厲程式碼風格
  3. PSR-3:紀錄器
  4. PSR-4:自動載入
  5. PSR-6:快取介面
  6. PSR-7:HTTP 消息介面

PSR-1:基本程式碼風格

PHP 標籤

必須使用 <?PHP ?><?= ?> 標籤包覆 PHP 程式碼。

編碼

所有的 PHP 檔案必須以沒有位元組順序記號(BOM)的 UTF-8 字元編碼。

目的

每個 PHP 檔案可以被用來定義符號(一個類別、特徵機制、函式、常數等)或執行一個有副作用的動作(產生輸出結果或處理資料)。

自動載入器

PHP 名稱空間和類別必須支援 PSR-4 自動載入器標準。

類別名稱

PHP 類別名稱必須使用共通的 CamelCase 格式,例如:CoffeeGrinder、CoffeeBean。

常數名稱

PHP 常數名稱必須全部大寫,使用底線區分單字,例如 LET_OUR_POWERS_COMBINE、GREAT_SCOTT。

方法名稱

PHP 方法名稱必須使用共通的 camelCase 格式,例如:phpIsAwesome、iLoveBacon。

PSR-2:嚴厲程式碼風格

縮排

必須使用 4 個空白字元來縮排。

檔案和行句

  1. 檔案的最後應該保有一行空白行。
  2. 檔案不能包含結尾 ?> 標籤,這是為了避免在之後加了一個空白行使得輸出造成錯誤。
  3. 每一行程式碼不應超過 80 個字元。
  4. 每一行程式碼的結尾不能有空白字元。

關鍵字

PHP 關鍵字一律使用小寫,如 truefalsenull 等。

名稱空間

每一個名稱空間宣告都必須接上一行空白行,使用 use 宣告時亦同。

1
2
3
4
5
6
7
8
9
namespace My\Component;

use Symfony\Components\HttpFoundation\Request;
use Symfony\Components\HttpFoundation\Response;

class App
{
//
}

類別

類別定義的起始括號必須要在類別名稱的下一行,而 extendsimplements 關鍵字必須跟類別名稱寫在同一行。

1
2
3
4
5
6
namespace My\App;

class Administrator extends User
{
//
}

方法

方法定義的起始括號必須要在類別名稱的下一行,而參數(除了最後一個)的後面緊接著一個逗號和一個空白字元。

1
2
3
4
5
6
7
8
9
namespace Animals;

class StrawNeckedIbis
{
public function flapWings($numberOfTimes = 3, $speed = 'fast')
{
//
}
}

能見度

必須為每一個類別的屬性和方法定義能見度,分別是 publicprotectedprivate

1
2
3
4
5
6
7
8
9
10
11
namespace Animals;

class StrawNeckedIbis
{
public static $numberOfBirds = 0;

public function __contruct()
{
static::$numberOfBirds++;
}
}

控制流程

所有的控制流程關鍵字必須接上一個空白字元,起始括號和控制流程關鍵字必須保持在同一樣。

1
2
3
4
5
6
7
8
9
10
$gorilla = new \Animals\Gorilla;
$ibis = new \Animals\StrawNeckedIbis;

if ($gorilla->isAwake() === true) {
do {
$gorrilla->beatChest();
} while ($ibis->isAsleep() === true);

$ibis->flyAway();
}

參考資料

  • Josh Lockhart(2015)。現代 PHP。台北市:碁峯資訊。