PHP編碼風格規范


由於PHP的靈活性,很多人寫起代碼來也不講求一個好的代碼規范,使得本就靈活的PHP代碼看起來很亂,其實PSR規范中的PSR-1和PSR-2已經定義了在PHP編碼中的一些規范,只要我們好好遵守這些規范,即使是使用靈活的腳本語言,也能寫出非常漂亮工整的代碼。首先我們來看一下已經通過的PSR規范,然后大致講解一下PSR-1和PSR-2規范的一些具體要求。

已通過的PSR

PSR編號 名稱 說明
1 基礎編碼規范 關於PHP標簽和基本命名約定等基礎的規范
2 編碼風格規范 關於大括號的位置和參數列表等編碼格式的規定
3 日志接口規范 關於日志級別以及記錄日志的行為的規定
4 自動加載規范 關於類和命名空間的命名約定,以及它們與文件系統間映射的規定
6 緩存接口規范 關於緩存管理的規定,其中包括數據類型、緩存項的生存周期、錯誤處理等
7 HTTP消息接口規范 關於HTTP請求和響應的約定

PSR-1基礎編碼規范

  1. 開閉標簽
    首先,PHP代碼必須以<?php或<?=標簽開始。換言之,我們不應該再使用短標簽<?或其它變化形式。
  2. 副作用
    PHP文件要么聲明類、接口、函數等,要么執行邏輯操作(如讀寫文件或向瀏覽器發送輸出),但不應該同時兼具兩者。
  3. 命名
    類的命名必須遵守大寫開頭的駝峰式命名規范。換言之,類名應當以大寫字母開頭。屬性的命名方式沒有強制要求,但應該保持一致。方法名稱必須符合小寫開頭的駝峰式命名規范。類常量中的所有字母必須大寫,單詞之間以下划線分隔。

PSR-2編碼風格規范

  1. PSR-1要求PHP代碼以<?php開頭。PSR-2規定,純PHP文件不應該以一個?>標簽結束,而應該以一個空白行結束。

  2. namespace聲明后應該插入一個空白行,use聲明語句塊后也應該要有一個空白行。不要在同一行代碼中進行多次use聲明。

  3. 類的開始和結束
    class關鍵字、類名,以及extends和implements關鍵字必須在同一行中。如果一個類實現了多個接口,那么這些接口名可以在類聲明的同一行中,也可以各占一行。如果選擇將這些接口名放在多行中,那么第一個接口名必須自成一行,而不是跟在implements關鍵字后面。類的開始花括號({)應該寫在函數聲明后自成一行,結束花括號(})也應該寫在類體后自成一行。也就是說,類聲明看起來如下所示

    class EarthGame extends Game implements
        Playable,
        Savable
    {
        //類體
    }
    

    也可以將類名與類聲明放在同一行中。

    class EarthGame extends Game implements Playble, Savable
    {
         //類體
    }
    
  4. 屬性聲明
    每個屬性都必須有訪問修飾符(public、private或protected)。不可以使用關鍵字var聲明屬性。PSR-1中已經涵蓋了屬性名的規范:可以使用下划線、小寫駝峰式命名或大寫駝峰式命名方式,但應該保持一致。(個人推薦屬性采用小寫式駝峰)

  5. 方法的開始和結束
    所有方法必須具有訪問修飾符(public、private或protected)。訪問修飾符必須在abstract或final之后,static之前。具有默認值得方法參數應該放在參數列表的末尾。

    • 單行聲明
      方法的開始花括號({)應該寫在方法名后自成一行,結束花括號(})也應該寫在方法體后自成一行(直接跟在方法代碼之后)。方法參數列表不應該以空格開始或結束(即應該緊貼包裹着它們的圓括號)。對於每個參數,參數名(或默認值)后面應該有一個逗號,且逗號后面有一個空格。這聽起來似乎有些復雜,如下所示:

      final public static function generateTile(int $diamondCount, bool $polluted = false)
      {
         //方法體
      }
      
   
 * 多行聲明
   如果方法有很多參數,那么單行方法聲明是不實際的。此時我們可以分割參數列表,以便將每個參數(包括類型、參數變量、默認值和逗號)單獨放在縮進的一行中。這種情況下,結束圓括號應該放在參數列表后面一行中,並與方法聲明的開始位置對齊。開始花括號({)應該在同一行的結束圓括號之后,以空格分隔。方法體應該從新的一行開始。同樣,這聽起來似乎很復雜,以下示例應該能幫助你理解這條規定。
 
   ```php
   public function __construct(
       int $size,
       string $name,
       bool $warparound = false,
       bool $aliens = false
   ) {
     //方法體
   }
   ```
 
6. 行與縮進
代碼應該使用4個空格符來縮進,而不是使用制表符。我們可以檢查編輯器設置,將其設置為按下Tab鍵時使用4個空格而不是制表符。每行代碼的長度不應該超過120個字符。

7. 方法與函數調用
 方法名稱和開始圓括號之間不能有空格。方法調用中的參數列表的規則與方法聲明中的參數列表規則相同。換言之,對於單行調用,開始圓括號后或結束圓括號前不能有空格。每個參數之后應該緊跟一個逗號,下一個參數前應該有一個空格。如果需要使用多行代碼進行方法調用,那么每個參數應該自成一行並縮進,而且結束圓括號也應該自成一行。

 ```php
 $earthGanme = new EarthGame(
       5,
       'earth',
       true,
       true
 );
 $earthGame::generateTile(5, true);
  1. 流程控制
    流程控制關鍵字(if、for、while等)后面必須緊跟一個空格。但是,開始圓括號后不能有空格。同樣,結束圓括號前不能有空格。因此內容應該緊貼在括號內的。與類和(單行)函數聲明相比,流程控制代碼的開始花括號應該與結束圓括號在同一行。結束花括號應該自成一行。以下是一個簡單的示例。

    $title = [];
    for ($x = 0; $x < $diamondCount; $x++) {
        if ($polluted) {
            $title[] = new PollutionDecorator(new DiamondDecorator(new Plains()));
        } else {
            $title[] = new DiamondDecorator(new Plains());
        }
    }
    

    注意if和for之后的空格。for和if語句與圓括號在同一行,而且它們的結束圓括號后都有一個空格,然后是流程控制體的開始花括號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM