PHP 標準推薦 (PSR) 簡介
已發表: 2019-12-24曾幾何時,在一次會議上,來自一系列框架的主要開發人員坐在同一個房間裡,商定了一些供他們所有項目使用的標準。 目的是使用戶更容易組合 PHP 框架和庫。 那時 php-fig:PHP 框架互操作組誕生了。 這群很棒的人負責監督 PHP 標準建議 (PSR)。
PHP 標準建議 (PSR) 是 PHP 框架互操作性組 (PHP-FIG) 發布的 PHP 規範。 它服務於 PHP 中編程概念的標準化。 目的是實現組件的互操作性。 PHP-FIG 由幾個 PHP 框架創始人組成。
PSR-0 & PSR-4
這些描述了從文件路徑自動加載類的規範。 PSR-0 和 PSR-4 都是關於命名空間、類名和文件路徑的標準。 此 PSR 還描述了將根據規範自動加載的文件的放置位置。
自動加載
自動加載是一項功能,可幫助開發人員自動包含 PHP 類,而無需在任何地方編寫混亂的包含/要求語句。
在 PHP 中,類的定義在它們被調用的文件中加載了 require 或 include 語句,即,在使用它之前,如下所示。

上面的方法提出了一些問題,就好像我們有數十個外部類要在一個文件中使用一樣,我們就在源文件的開頭開始編寫 require/include 語句行。
為了解決這個問題,PHP 5 引入了魔術函數 __autoload(),當您的代碼引用尚未加載的類或接口時,它會自動調用。

下面是一個基本的 __autoload() 實現的例子:

__autoload() 函數的主要缺點是您只能提供一個自動加載器。 PHP 5.1.2 引入了另一個自動加載函數 (spl_autoload_register) 來應對 __autoload 的限制。
spl_autoload_register() 的引入使程序員能夠創建自動加載鏈,這是一系列可以調用以嘗試加載類或接口的函數。
例如:


自動加載是一個很棒的想法,以至於每個項目都開始使用它。 由於缺乏統一的標準,每個人都不可避免地創建了自己的自動裝載機版本。 顯然,PHP 迫切需要一個自動加載器標準,這就是 PSR-0 的誕生方式。 最新接受的自動加載器標準是 PSR-4。
PSR-0(自動加載標準)
PSR-0 概述:
- 完全限定的命名空間和類必須具有以下結構
\<供應商名稱>\(<命名空間>\)*<類名> - 每個命名空間都必須有一個頂級命名空間(“供應商名稱”)。
- 每個命名空間可以有任意數量的子命名空間。
- 從文件系統加載時,每個命名空間分隔符都會轉換為 DIRECTORY_SEPARATOR。
- CLASS NAME 中的每個 _ 字符都轉換為 DIRECTORY_SEPARATOR。 _ 字符在命名空間中沒有特殊含義。
- 從文件系統加載時,完全限定的命名空間和類以 .php 為後綴。
- 供應商名稱、命名空間和類名稱中的字母字符可以是小寫和大寫的任意組合。
例子:
\Doctrine\Common\IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php
PSR-4(自動加載標準)
PSR-4 概述:
- 術語“類”指的是類、接口、特徵和其他類似的結構。
- 完全限定的類名具有以下形式:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName> - 完全限定的類名必須具有頂級命名空間名稱,也稱為“供應商命名空間”。
- 完全限定的類名可以有一個或多個子命名空間名稱。
- 完全限定的類名必須有一個終止類名。
- 下劃線在全限定類名的任何部分都沒有特殊含義。
- 完全限定類名中的字母字符可以是小寫和大寫的任意組合。
- 所有類名都必須以區分大小寫的方式引用。
使用 Composer 基於 PSR-4 的自動加載示例:
- 考慮以下目錄結構以使用 Composer 實現基於 PSR-4 的自動加載。

- 使用 composer init 創建一個 composer.json 文件。 如果沒有,您現在可以在項目的根目錄中手動創建一個。

- 通過編輯 composer.json 文件來設置 PSR4 自動加載,如下所示:

- 在這裡,CodeCourse 是應用程序的供應商名稱,您可以在命名 src 目錄中的文件時使用此名稱,例如:

或者

等等,
- src 是您要自動加載的應用程序目錄。
- 接下來,打開您的終端並輸入以下命令以在您的項目中安裝自動加載文件。這將在其中生成供應商目錄和 autoload.php 文件。

- 讓我們首先在 CodeCourse 目錄中創建幾個類。
在 CodeCourse/Filters 中創建 AuthFilters.php


在 CodeCourse/Repositories 中創建 UserRepository.php

- 最後,創建一個 index.php 文件來測試它,並且需要將 autoload.php 文件一次 require 一次到您的 index.php 文件中。

PSR-1 & PSR-2
PSR-1 和 PSR-2 對 PHP 編碼標準很有用。 PSR-1 主要側重於 PHP 的基本編碼標準,而 PSR-2 更像是 PSR-1 的擴展版本。 PSR-1 列出了一組簡單的命名約定規則,PSR-2 提供了更全面的編碼風格指南。
PSR-1(基本編碼標準)
PSR-1 概述:
- PHP 標籤只允許 <?php 或 <?= 。
- 類名必須在大寫字母中定義。
- 類變量必須在camelCase 中定義。
- 類常量必須在 UPPER_SNAKE_CASE 中定義。
- 方法名稱必須以駝峰命名。
- 文件應該聲明符號(類、函數、常量等)或引起副作用(例如生成輸出、更改 .ini 設置等),但不應該兩者都做。 IE,

上面的例子會導致一個副作用,即加載一個名為“file.php”的文件。
- 文件必須是沒有 BOM(字節順序標記)的 UTF-8。
- 命名空間和類名必須遵循 PSR-0 和 PSR-4 中的標準。
下面是一個示例,說明了屬性、類和方法的基本命名約定。

PSR-2(編碼風格指南)
PSR-2 概述:
- 您必須遵循 PSR-1 編碼標準。
- 4 個空格必須用於縮進。 不允許使用選項卡。
- 行長沒有限制,但應在 120 個字符以下,最好在 80 個字符以下。
- 命名空間聲明後必須有一個空行,使用聲明塊後必須有一個空行。
- 類和方法的左花括號必須放在下一行,右花括號必須放在正文之後的一行。
- 方法和屬性必須先用abstract/final 定義,然後是public/protected,最後是static 關鍵字。
- 您不得在條件語句中的花括號前放置換行符。
- 您不得在條件語句中的 ( 和 ) 之前放置任何空格。
- 定義類的示例:
- 您必須在新行上打開花括號,並且必須在一行中使用 extends 和 implements 關鍵字。

如果有多個接口要實現,那麼你可以在新行中寫入接口名稱,如下所示:

顯示如何在 PHP 中定義方法的示例:
在定義方法時,參數應該寫在同一行中。 此外,您不得在參數中的逗號之前放置任何空格,並且必須在它們之後放置一個空格。

如果有很多參數,那麼它們可以一個接一個地寫在換行符中:

定義方法時,您必須具有 public/protected/private 和 abstract/final 之一。 如果使用,可見性模式位於 abstract/final 關鍵字之後。 static 是最後一個修飾符。

條件語句
- 您必須在 (
- 您不得在 (
- 您不得在 ) 之前放置任何空格
- 你必須在 ) 後面放一個空格
- 使用 elseif 而不是 else if。
顯示 elseif 和 else if 之間區別的示例:
elseif的解釋:

else if 的解釋:

對於 switch 語句,
- 花括號必須在編寫 switch 語句的同一行中打開。
- 外殼主體必須從外殼縮進一次,外殼必須從開關縮進一次。
- 不需要休息時不要休息。
- 您也可以使用 return 代替 break。
例子:
