PHP編碼規(guī)范

目的

為了更好的提高技術(shù)部的工作效率,保證開發(fā)的有效性和合理性,并可最大程度的提高程序代碼的可讀性和可重復(fù)利用性,指定此規(guī)范。

整體要求

本規(guī)范以PSR規(guī)范為基礎(chǔ)擴(kuò)展補充制定。 完全遵守PSR-1, PSR-2規(guī)范。
規(guī)范包命名規(guī)范、代碼縮進(jìn)規(guī)則、控制結(jié)構(gòu)、函數(shù)調(diào)用、函數(shù)定義、注釋、包含代碼、PHP標(biāo)記、文件頭的注釋塊、常量命名等方面的規(guī)則。

規(guī)范

  • 文件
  • 源文件 必須 只使用 <?php。
  • 源文件中php代碼的編碼格式 必須 只使用不帶BOM的UTF-8。
  • 源文件在文件結(jié)尾處 必須 忽略掉?>且 必須 以一個空行結(jié)尾。
  • 類定義文件建議使用類名作為文件名。
  • 類文件必須使用命名空間為路徑存儲。
  • 類文件名和類名保存一致,用首字母大寫。其他文件全部用小寫字母加下劃線。
  • 基礎(chǔ)規(guī)范
    一個源文件 建議 只用來做聲明(類,函數(shù),常量等)或者只用來做一些輔助作用的操作(例如:輸出信息,修改.ini配置等),但不應(yīng)當(dāng)同時做這兩件事。
    類名 必須 使用 StudlyCaps 寫法,比如SampleController。
    類中的常量 必須 只由大寫字母和下劃線(_)組成。
    方法名 必須 使用 camelCase(駝峰式)寫法,比如getTotalById。
  • 代碼規(guī)范
    代碼必須使用4個空格符而不是 tab鍵 進(jìn)行縮進(jìn)。
    備注: 使用空格而不是 tab鍵 縮進(jìn)的好處在于,
    避免在比較代碼差異、打補丁、重閱代碼以及注釋時產(chǎn)生混淆。
    并且,使用空格縮進(jìn),讓對齊變得更方便。

關(guān)鍵字 以及 true / false / null

PHP所有 關(guān)鍵字必須全部小寫。
常量 true 、false 和 null 也必須全部小寫。

每行的字符數(shù)應(yīng)該保持在100個以內(nèi), 通常情況不應(yīng)超過150個。如果換行可能破壞語意或降低可閱讀性,可作為例外超出限制。

每個 namespace 命名空間聲明語句和 use 聲明語句塊后面,必須插入一個空白行。所有 use 必須 在 namespace 后聲明。每條 use 聲明語句 必須 只有一個 use 關(guān)鍵詞。use 聲明語句塊后 必須 要有一個空白行。例如:

  <?php
  namespace Vendor\Package;

  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;

  // ... additional PHP code ...
擴(kuò)展與繼承,關(guān)鍵詞 extends 和 implements 必須寫在類名稱的同一行,類的開始花括號必須獨占一行,結(jié)束花括號也必須在類主體后獨占一行。

  namespace Vendor\Package;

  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;

  class ClassName extends ParentClass implements \ArrayAccess, \Countable
  {
      // constants, properties, methods
  }

implements 的繼承列表也可以分成多行,這樣的話,每個繼承接口名稱都必須分開獨立成行,包括第一個。

  <?php
  namespace Vendor\Package;

  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;

  class ClassName extends ParentClass implements
      \ArrayAccess,
      \Countable,
      \Serializable
  {
      // constants, properties, methods
  }

類的開始花括號({)必須寫在函數(shù)聲明后自成一行,結(jié)束花括號(})也必須寫在函數(shù)主體后自成一行。

方法的開始花括號({)必須寫在函數(shù)聲明后自成一行,結(jié)束花括號(})也必須寫在函數(shù)主體后自成一行。

一個標(biāo)準(zhǔn)的方法聲明可參照以下范例,留意其括號、逗號、空格以及花括號的位置。

  <?php
  namespace Vendor\Package;

  class ClassName
  {
      public function fooBarBaz($arg1, &$arg2, $arg3 = [])
      {
          // method body
      }
  }

類的屬性和方法必須添加訪問修飾符(private、protected 以及 public), abstract 以及 final 必須聲明在訪問修飾符之前,而 static 必須聲明在訪問修飾符之后。

以下是屬性聲明的一個范例

  <?php
  namespace Vendor\Package;

  class ClassName
  {
      public $foo = null;
  }

需要添加 abstract 或 final 聲明時, 必須 寫在訪問修飾符前,而 static 則必須寫在其后。

  <?php
  namespace Vendor\Package;

  abstract class ClassName
  {
      protected static $foo;

      abstract protected function zim();

      final public static function bar()
      {
          // method body
      }
  }

  • 控制結(jié)構(gòu)的基本規(guī)范如下

控制結(jié)構(gòu)的關(guān)鍵字后 必須 要有一個空格符,而調(diào)用方法或函數(shù)時則一定不能有。
控制結(jié)構(gòu)的開始花括號({) 必須 寫在聲明的同一行,而結(jié)束花括號(})必須寫在主體后自成一行。
控制結(jié)構(gòu)的開始左括號后和結(jié)束右括號前,都一定不能有空格符。
case 語句 必須 相對 switch 進(jìn)行一次縮進(jìn),而 break 語句以及 case 內(nèi)的其它語句都 必須 相對 case 進(jìn)行一次縮進(jìn)。
如果存在非空的 case 直穿語句,主體里必須有類似 // no break 的注釋。例如:

  <?php
  switch ($expr) {
      case 0:
          echo 'First case, with a break';
          break;
      case 1:
          echo 'Second case, which falls through';
          // no break
      case 2:
      case 3:
      case 4:
          echo 'Third case, return instead of break';
          return;
      default:
          echo 'Default case';
          break;
  }

應(yīng)該 使用關(guān)鍵詞 elseif 代替所有 else if,以使得所有的控制關(guān)鍵字都像是單獨的一個詞。例如:

  <?php
  if ($expr1) {
      // if body
  } elseif ($expr2) {
      // elseif body
  } else {
      // else body;
  }

運算符(=, +, -, *, /, %, +=等等)左右兩邊 必須要有 一個空格。
參數(shù)和變量列表中逗號(,)前 必須不能有 空格,而逗號后 必須要有 空格。

 <?php
 namespace Vendor\Package;

 class ClassName
 {
     public function foo($arg1, &$arg2, $arg3 = [])
     {
         // method body
     }
 }

參數(shù)列表可以分列成多行,這樣,包括第一個參數(shù)在內(nèi)的每個參數(shù)都 必須 單獨成行。
拆分成多行的參數(shù)列表后,結(jié)束括號以及方法開始花括號 必須 寫在同一行,中間用一個空格分隔。

  <?php
  namespace Vendor\Package;

  class ClassName
  {
      public function aVeryLongMethodName(
          ClassTypeHint $arg1,
          &$arg2,
          array $arg3 = []
      ) {
          // method body
      }
  }

while 和 do while。一個規(guī)范的 while 語句應(yīng)該如下所示,注意其 括號、空格以及花括號的位置。

 <?php
 while ($expr) {
     // structure body
 }

標(biāo)準(zhǔn)的 do while 語句如下所示,同樣的,注意其 括號、空格以及花括號的位置。

<?php
 do {
     // structure body;
 } while ($expr);

標(biāo)準(zhǔn)的 for 語句如下所示,注意其括號、空格以及花括號的位置

 <?php
 for ($i = 0; $i < 10; $i++) {
 // for body
 }

標(biāo)準(zhǔn)的 foreach語句如下所示,注意其括號、空格以及花括號的位置。例如:

 <?php
 foreach ($iterable as $key => $value) {
     // foreach body
 }

標(biāo)準(zhǔn)的 try catch語句如下所示,注意其括號、空格以及花括號的位置。例如:

 <?php
 try {
     // try body
 } catch (FirstExceptionType $e) {
     // catch body
 } catch (OtherExceptionType $e) {
     // catch body
 }

閉包聲明時,關(guān)鍵詞 function 后以及關(guān)鍵詞use的前后都必須要有一個空格。

 <?php
 $closureWithArgs = function ($arg1, $arg2) {
     // body
 };

 $closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
     // body
 };

變量名統(tǒng)一用駝峰命名法。

PHP 標(biāo)準(zhǔn)規(guī)范

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容