【PHP開發規範】繼承與擴展:PSR-2 編碼風格規範

 

以前的一篇文章是對PSR-1的基本介紹php

接下來是PSR-2 編碼風格規範,它是 PSR-1 基本代碼規範的繼承與擴展。閉包

PSR-1 和PSR-2是PHP開發中基本的編碼規範,你們其實均可以參考學習下,雖說每一個開發者都有本身熟悉的一套開發規範,可是我以爲仍是根據行業標準來編寫咱們的代碼,畢竟標準都是通過驗證的了。但願能對PHP開發者有幫助吧。編輯器

 

1. 概覽

  • 代碼 必須 遵循 [PSR-1]() 中的編碼規範 。
  • 代碼 必須 使用4個空格符而不是「Tab 鍵」進行縮進。
  • 每行的字符數 應該 軟性保持在 80 個以內,理論上 必定不可 多於 120 個,但 必定不可 有硬性限制。
  • 每一個 namespace 命名空間聲明語句和 use 聲明語句塊後面,必須 插入一個空白行。
  • 類的開始花括號({) 必須 寫在類聲明後自成一行,結束花括號(})也 必須 寫在類主體後自成一行。
  • 方法的開始花括號({) 必須 寫在函數聲明後自成一行,結束花括號(})也 必須 寫在函數主體後自成一行。
  • 類的屬性和方法 必須 添加訪問修飾符(private、protected 以及 public),abstract 以及 final 必須 聲明在訪問修飾符以前,而 static 必須 聲明在訪問修飾符以後。
  • 控制結構的關鍵字後 必須 要有一個空格符,而調用方法或函數時則 必定不可 有。
  • 控制結構的開始花括號({) 必須 寫在聲明的同一行,而結束花括號(}) 必須 寫在主體後自成一行。
  • 控制結構的開始左括號後和結束右括號前,都 必定不可 有空格符。

1.1. 例子

如下例子程序簡單地展現了以上大部分規範:函數

<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
 public function sampleFunction($a, $b = null)
 {
 if ($a === $b) {
 bar();
 } elseif ($a > $b) {
 $foo->bar($arg1);
 } else {
 BazClass::bar($arg2, $arg3);
 }
 }
 final public static function bar()
 {
 // 方法的內容
 }
}

2. 通則

2.1 基本編碼準則

代碼 必須 符合 [PSR-1]() 中的全部規範。學習

2.2 文件

全部PHP文件 必須 使用 Unix LF (linefeed) 做爲行的結束符。編碼

全部PHP文件 必須 以一個空白行做爲結束。spa

純PHP代碼文件 必須 省略最後的 ?> 結束標籤。代碼規範

2.3. 行

行的長度 必定不可 有硬性的約束。code

軟性的長度約束 必須 要限制在 120 個字符之內,若超過此長度,帶代碼規範檢查的編輯器 必須 要發出警告,不過 必定不可 發出錯誤提示。blog

每行 不應 多於80個字符,大於80字符的行 應該 折成多行。

非空行後 必定不可 有多餘的空格符。

空行 能夠 使得閱讀代碼更加方便以及有助於代碼的分塊。

每行 必定不可 存在多於一條語句。

2.4. 縮進

代碼 必須 使用4個空格符的縮進,必定不可 用 tab鍵。

備註:使用空格而不是「tab鍵縮進」的好處在於,

避免在比較代碼差別、打補丁、重閱代碼以及註釋時產生混淆。

而且,使用空格縮進,讓對齊變得更方便。

2.5. 關鍵字 以及 True/False/Null

PHP全部 關鍵字 必須 所有小寫。

常量 true 、false 和 null 也 必須 所有小寫。

3. namespace 以及 use 聲明

namespace 聲明後 必須 插入一個空白行。

全部 use 必須 在 namespace 後聲明。

每條 use 聲明語句 必須 只有一個 use 關鍵詞。

use 聲明語句塊後 必須 要有一個空白行。

例如:

<?php

namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

4. 類、屬性和方法

此處的「類」泛指全部的「class類」、「接口」以及「traits 可複用代碼塊」。

4.1. 擴展與繼承

關鍵詞 extends 和 implements 必須 寫在類名稱的同一行。

類的開始花括號 必須 獨佔一行,結束花括號也 必須 在類主體後獨佔一行。

<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
 // 這裏面是常量、屬性、類方法
}

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

<?php

namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
 \ArrayAccess,
 \Countable,
 \Serializable
{
 // 這裏面是常量、屬性、類方法
}

4.2. 屬性

每一個屬性都 必須 添加訪問修飾符。

必定不可 使用關鍵字 var 聲明一個屬性。

每條語句 必定不可 定義超過一個屬性。

不應 使用下劃線做爲前綴,來區分屬性是 protected 或 private。

如下是屬性聲明的一個範例:

<?php
namespace Vendor\Package;
class ClassName
{
 public $foo = null;
}

4.3. 方法

全部方法都 必須 添加訪問修飾符。

不應 使用下劃線做爲前綴,來區分方法是 protected 或 private。

方法名稱後 必定不可 有空格符,其開始花括號 必須 獨佔一行,結束花括號也 必須 在方法主體後單獨成一行。參數左括號後和右括號前 必定不可 有空格。

一個標準的方法聲明可參照如下範例,留意其括號、逗號、空格以及花括號的位置。

<?php
namespace Vendor\Package;
class ClassName
{
 public function fooBarBaz($arg1, &$arg2, $arg3 = [])
 {
 // method body
 }
}

4.4. 方法的參數

參數列表中,每一個逗號後面 必須 要有一個空格,而逗號前面 必定不可 有空格。

有默認值的參數,必須 放到參數列表的末尾。

<?php
namespace Vendor\Package;
class ClassName
{
 public function foo($arg1, &$arg2, $arg3 = [])
 {
 // method body
 }
}

參數列表 能夠 分列成多行,這樣,包括第一個參數在內的每一個參數都 必須 單獨成行。

拆分紅多行的參數列表後,結束括號以及方法開始花括號 必須 寫在同一行,中間用一個空格分隔。

<?php
namespace Vendor\Package;
class ClassName
{
 public function aVeryLongMethodName(
 ClassTypeHint $arg1,
 &$arg2,
 array $arg3 = []
 ) {
 // 方法的內容
 }
}

4.5. abstract 、 final 、 以及 static

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

<?php
namespace Vendor\Package;
abstract class ClassName
{
 protected static $foo;
 abstract protected function zim();
 final public static function bar()
 {
 // method body
 }
}

4.6. 方法及函數調用

方法及函數調用時,方法名或函數名與參數左括號之間 必定不可 有空格,參數右括號前也 必定不可 有空格。每一個參數前 必定不可 有空格,但其後 必須 有一個空格。

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
參數 能夠 分列成多行,此時包括第一個參數在內的每一個參數都 必須 單獨成行。
<?php
$foo->bar(
 $longArgument,
 $longerArgument,
 $muchLongerArgument
);

5. 控制結構

控制結構的基本規範以下:

  • 控制結構關鍵詞後 必須 有一個空格。
  • 左括號 ( 後 必定不可 有空格。
  • 右括號 ) 前也 必定不可 有空格。
  • 右括號 ) 與開始花括號 { 間 必須 有一個空格。
  • 結構體主體 必須 要有一次縮進。
  • 結束花括號 } 必須 在結構體主體後單獨成行。

每一個結構體的主體都 必須 被包含在成對的花括號之中,

這能讓結構體更加結構話,以及減小加入新行時,出錯的可能性。

5.1. if 、elseif 和 else

標準的 if 結構以下代碼所示,請留意「括號」、「空格」以及「花括號」的位置,

注意 else 和 elseif 都與前面的結束花括號在同一行。

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

應該 使用關鍵詞 elseif 代替全部 else if ,以使得全部的控制關鍵字都像是單獨的一個詞。

5.2. switch 和 case

標準的 switch 結構以下代碼所示,留意括號、空格以及花括號的位置。

case 語句 必須 相對 switch 進行一次縮進,而 break 語句以及 case 內的其它語句都 必須 相對 case進行一次縮進。

若是存在非空的 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;
}

5.3. while 和 do while

一個規範的 while 語句應該以下所示,注意其「括號」、「空格」以及「花括號」的位置。

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

標準的 do while 語句以下所示,一樣的,注意其「括號」、「空格」以及「花括號」的位置。

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

5.4. for

標準的 for 語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。

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

5.5. foreach

標準的 foreach 語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。

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

5.6. try, catch

標準的 try catch 語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。

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

6. 閉包

閉包聲明時,關鍵詞 function 後以及關鍵詞 use 的先後都 必須 要有一個空格。

開始花括號 必須 寫在聲明的同一行,結束花括號 必須 緊跟主體結束的下一行。

參數列表和變量列表的左括號後以及右括號前,必定不可 有空格。

參數和變量列表中,逗號前 必定不可 有空格,而逗號後 必須 要有空格。

閉包中有默認值的參數 必須 放到列表的後面。

標準的閉包聲明語句以下所示,注意其「括號」、「空格」以及「花括號」的位置。

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

參數列表以及變量列表 能夠 分紅多行,這樣,包括第一個在內的每一個參數或變量都 必須 單獨成行,而列表的右括號與閉包的開始花括號 必須 放在同一行。

如下幾個例子,包含了參數和變量列表被分紅多行的多狀況。

<?php
$longArgs_noVars = function (
 $longArgument,
 $longerArgument,
 $muchLongerArgument
) {
 // body
};
$noArgs_longVars = function () use (
 $longVar1,
 $longerVar2,
 $muchLongerVar3
) {
 // body
};
$longArgs_longVars = function (
 $longArgument,
 $longerArgument,
 $muchLongerArgument
) use (
 $longVar1,
 $longerVar2,
 $muchLongerVar3
) {
 // body
};
$longArgs_shortVars = function (
 $longArgument,
 $longerArgument,
 $muchLongerArgument
) use ($var1) {
 // body
};
$shortArgs_longVars = function ($arg) use (
 $longVar1,
 $longerVar2,
 $muchLongerVar3
) {
 // body
};

注意,閉包被直接用做函數或方法調用的參數時,以上規則仍然適用。

<?php
$foo->bar(
 $arg1,
 function ($arg2) use ($var1) {
 // body
 },
 $arg3
);

 

 參考資料:

https://psr.phphub.org/

 

 

------------------------------------------------------------------------------

歡迎關注個人公衆號【phper的進階之路】,將不斷更新各類技術心得,免費提供各類學習資源!!!
相關文章
相關標籤/搜索