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 語句,即,在使用它之前,如下所示。

psr 圖像 1

上面的方法提出了一些問題,就好像我們有數十個外部類要在一個文件中使用一樣,我們就在源文件的開頭開始編寫 require/include 語句行。

為了解決這個問題,PHP 5 引入了魔術函數 __autoload(),當您的代碼引用尚未加載的類或接口時,它會自動調用。

psr圖片2

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

psr_image3

__autoload() 函數的主要缺點是您只能提供一個自動加載器。 PHP 5.1.2 引入了另一個自動加載函數 (spl_autoload_register) 來應對 __autoload 的限制。

spl_autoload_register() 的引入使程序員能夠創建自動加載鏈,這是一系列可以調用以嘗試加載類或接口的函數。

例如:

psr_image4psr_image5

自動加載是一個很棒的想法,以至於每個項目都開始使用它。 由於缺乏統一的標準,每個人都不可避免地創建了自己的自動裝載機版本。 顯然,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 的自動加載。
psr_image6
  • 使用 composer init 創建一個 composer.json 文件。 如果沒有,您現在可以在項目的根目錄中手動創建一個。
psr_image7
  • 通過編輯 composer.json 文件來設置 PSR4 自動加載,如下所示:
psr_image8
  • 在這裡,CodeCourse 是應用程序的供應商名稱,您可以在命名 src 目錄中的文件時使用此名稱,例如:
    psr_image9

    或者

psr_image10

等等,

  • src 是您要自動加載的應用程序目錄。
  • 接下來,打開您的終端並輸入以下命令以在您的項目中安裝自動加載文件。這將在其中生成供應商目錄和 autoload.php 文件。
psr_image11
  • 讓我們首先在 CodeCourse 目錄中創建幾個類。

在 CodeCourse/Filters 中創建 AuthFilters.php

psr_image11

在 CodeCourse/Repositories 中創建 UserRepository.php

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

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,
psr_image15

上面的例子會導致一個副作用,即加載一個名為“file.php”的文件。

  • 文件必須是沒有 BOM(字節順序標記)的 UTF-8。
  • 命名空間和類名必須遵循 PSR-0 和 PSR-4 中的標準。

下面是一個示例,說明了屬性、類和方法的基本命名約定。

psr_image16

PSR-2(編碼風格指南)

PSR-2 概述:

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

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

psr_image18

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

psr_image19

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

psr_image20

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

psr_image21

條件語句

  • 您必須在 (
  • 您不得在 (
  • 您不得在 ) 之前放置任何空格
  • 你必須在 ) 後面放一個空格
  • 使用 elseif 而不是 else if。

顯示 elseif 和 else if 之間區別的示例:
elseif的解釋:

psr_image22

else if 的解釋:

psr_image23

對於 switch 語句,

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

例子:

psr_image24