php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范
之前的一篇文章是對(duì)PSR-1的基本介紹
接下來是PSR-2 編碼風(fēng)格規(guī)范,它是 PSR-1 基本代碼規(guī)范的繼承與擴(kuò)展。
PSR-1 和PSR-2是PHP開發(fā)中基本的編碼規(guī)范,大家其實(shí)都可以參考學(xué)習(xí)下,雖然說每個(gè)開發(fā)者都有自己熟悉的一套開發(fā)規(guī)范,但是我覺得還是根據(jù)行業(yè)標(biāo)準(zhǔn)來編寫我們的代碼,畢竟標(biāo)準(zhǔn)都是經(jīng)過驗(yàn)證的了。希望能對(duì)PHP開發(fā)者有幫助吧。
1. 概覽
- 代碼 必須 遵循 [PSR-1]() 中的編碼規(guī)范 。
- 代碼 必須 使用4個(gè)空格符而不是「Tab 鍵」進(jìn)行縮進(jìn)。
- 每行的字符數(shù) 應(yīng)該 軟性保持在 80 個(gè)之內(nèi),理論上 一定不可 多于 120 個(gè),但 一定不可 有硬性限制。
- 每個(gè) namespace 命名空間聲明語(yǔ)句和 use 聲明語(yǔ)句塊后面,必須 插入一個(gè)空白行。
- 類的開始花括號(hào)({) 必須 寫在類聲明后自成一行,結(jié)束花括號(hào)(})也 必須 寫在類主體后自成一行。
- 方法的開始花括號(hào)({) 必須 寫在函數(shù)聲明后自成一行,結(jié)束花括號(hào)(})也 必須 寫在函數(shù)主體后自成一行。
- 類的屬性和方法 必須 添加訪問修飾符(private、protected 以及 public),abstract 以及 final 必須 聲明在訪問修飾符之前,而 static 必須 聲明在訪問修飾符之后。
- 控制結(jié)構(gòu)的關(guān)鍵字后 必須 要有一個(gè)空格符,而調(diào)用方法或函數(shù)時(shí)則 一定不可 有。
- 控制結(jié)構(gòu)的開始花括號(hào)({) 必須 寫在聲明的同一行,而結(jié)束花括號(hào)(}) 必須 寫在主體后自成一行。
- 控制結(jié)構(gòu)的開始左括號(hào)后和結(jié)束右括號(hào)前,都 一定不可 有空格符。
1.1. 例子
以下例子程序簡(jiǎn)單地展示了以上大部分規(guī)范:
<?phpnamespace VendorPackage;use FooInterface;use BarClass as Bar;use OtherVendorOtherPackageBazClass;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() { // 方法的內(nèi)容 }}2. 通則
2.1 基本編碼準(zhǔn)則
代碼 必須 符合 [PSR-1]() 中的所有規(guī)范。
2.2 文件
所有PHP文件 必須 使用 Unix LF (linefeed) 作為行的結(jié)束符。
所有PHP文件 必須 以一個(gè)空白行作為結(jié)束。
純PHP代碼文件 必須 省略最后的 ?> 結(jié)束標(biāo)簽。
2.3. 行
行的長(zhǎng)度 一定不可 有硬性的約束。
軟性的長(zhǎng)度約束 必須 要限制在 120 個(gè)字符以內(nèi),若超過此長(zhǎng)度,帶代碼規(guī)范檢查的編輯器 必須 要發(fā)出警告,不過 一定不可 發(fā)出錯(cuò)誤提示。
每行 不該 多于80個(gè)字符,大于80字符的行 應(yīng)該 折成多行。
非空行后 一定不可 有多余的空格符。
空行 可以 使得閱讀代碼更加方便以及有助于代碼的分塊。
每行 一定不可 存在多于一條語(yǔ)句。
2.4. 縮進(jìn)
代碼 必須 使用4個(gè)空格符的縮進(jìn),一定不可 用 tab鍵。
備注:使用空格而不是「tab鍵縮進(jìn)」的好處在于,
避免在比較代碼差異、打補(bǔ)丁、重閱代碼以及注釋時(shí)產(chǎn)生混淆。
并且,使用空格縮進(jìn),讓對(duì)齊變得更方便。
2.5. 關(guān)鍵字 以及 True/False/Null
PHP所有 關(guān)鍵字 必須 全部小寫。
常量 true 、false 和 null 也 必須 全部小寫。
3. namespace 以及 use 聲明
namespace 聲明后 必須 插入一個(gè)空白行。
所有 use 必須 在 namespace 后聲明。
每條 use 聲明語(yǔ)句 必須 只有一個(gè) use 關(guān)鍵詞。
use 聲明語(yǔ)句塊后 必須 要有一個(gè)空白行。
例如:
namespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;4. 類、屬性和方法
此處的「類」泛指所有的「class類」、「接口」以及「traits 可復(fù)用代碼塊」。
4.1. 擴(kuò)展與繼承
關(guān)鍵詞 extends 和 implements 必須 寫在類名稱的同一行。
類的開始花括號(hào) 必須 獨(dú)占一行,結(jié)束花括號(hào)也 必須 在類主體后獨(dú)占一行。
<?phpnamespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class ClassName extends ParentClass implements ArrayAccess, Countable{ // 這里面是常量、屬性、類方法}implements 的繼承列表也 可以 分成多行,這樣的話,每個(gè)繼承接口名稱都 必須 分開獨(dú)立成行,包括第一個(gè)。
namespace VendorPackage;use FooClass;use BarClass as Bar;use OtherVendorOtherPackageBazClass;class ClassName extends ParentClass implements ArrayAccess, Countable, Serializable{ // 這里面是常量、屬性、類方法}4.2. 屬性
每個(gè)屬性都 必須 添加訪問修飾符。
一定不可 使用關(guān)鍵字 var 聲明一個(gè)屬性。
每條語(yǔ)句 一定不可 定義超過一個(gè)屬性。
不該 使用下劃線作為前綴,來區(qū)分屬性是 protected 或 private。
以下是屬性聲明的一個(gè)范例:
<?phpnamespace VendorPackage;class ClassName{ public $foo = null;}4.3. 方法
所有方法都 必須 添加訪問修飾符。
不該 使用下劃線作為前綴,來區(qū)分方法是 protected 或 private。
方法名稱后 一定不可 有空格符,其開始花括號(hào) 必須 獨(dú)占一行,結(jié)束花括號(hào)也 必須 在方法主體后單獨(dú)成一行。參數(shù)左括號(hào)后和右括號(hào)前 一定不可 有空格。
一個(gè)標(biāo)準(zhǔn)的方法聲明可參照以下范例,留意其括號(hào)、逗號(hào)、空格以及花括號(hào)的位置。
<?phpnamespace VendorPackage;class ClassName{ public function fooBarBaz($arg1, &$arg2, $arg3 = []) { // method body }}4.4. 方法的參數(shù)
參數(shù)列表中,每個(gè)逗號(hào)后面 必須 要有一個(gè)空格,而逗號(hào)前面 一定不可 有空格。
有默認(rèn)值的參數(shù),必須 放到參數(shù)列表的末尾。
<?phpnamespace VendorPackage;class ClassName{ public function foo($arg1, &$arg2, $arg3 = []) { // method body }}參數(shù)列表 可以 分列成多行,這樣,包括第一個(gè)參數(shù)在內(nèi)的每個(gè)參數(shù)都 必須 單獨(dú)成行。
拆分成多行的參數(shù)列表后,結(jié)束括號(hào)以及方法開始花括號(hào) 必須 寫在同一行,中間用一個(gè)空格分隔。
<?phpnamespace VendorPackage;class ClassName{ public function aVeryLongMethodName( ClassTypeHint $arg1, &$arg2, array $arg3 = [] ) { // 方法的內(nèi)容 }}4.5. abstract 、 final 、 以及 static
需要添加 abstract 或 final 聲明時(shí),必須 寫在訪問修飾符前,而 static 則 必須 寫在其后。
<?phpnamespace VendorPackage;abstract class ClassName{ protected static $foo; abstract protected function zim(); final public static function bar() { // method body }}4.6. 方法及函數(shù)調(diào)用
方法及函數(shù)調(diào)用時(shí),方法名或函數(shù)名與參數(shù)左括號(hào)之間 一定不可 有空格,參數(shù)右括號(hào)前也 一定不可 有空格。每個(gè)參數(shù)前 一定不可 有空格,但其后 必須 有一個(gè)空格。
<?phpbar ();$foo->bar($arg1);Foo::bar($arg2, $arg3);參數(shù) 可以 分列成多行,此時(shí)包括第一個(gè)參數(shù)在內(nèi)的每個(gè)參數(shù)都 必須 單獨(dú)成行。<?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument);5. 控制結(jié)構(gòu)
控制結(jié)構(gòu)的基本規(guī)范如下:
- 控制結(jié)構(gòu)關(guān)鍵詞后 必須 有一個(gè)空格。
- 左括號(hào) ( 后 一定不可 有空格。
- 右括號(hào) ) 前也 一定不可 有空格。
- 右括號(hào) ) 與開始花括號(hào) { 間 必須 有一個(gè)空格。
- 結(jié)構(gòu)體主體 必須 要有一次縮進(jìn)。
- 結(jié)束花括號(hào) } 必須 在結(jié)構(gòu)體主體后單獨(dú)成行。
每個(gè)結(jié)構(gòu)體的主體都 必須 被包含在成對(duì)的花括號(hào)之中,
這能讓結(jié)構(gòu)體更加結(jié)構(gòu)話,以及減少加入新行時(shí),出錯(cuò)的可能性。
5.1. if 、elseif 和 else
標(biāo)準(zhǔn)的 if 結(jié)構(gòu)如下代碼所示,請(qǐng)留意「括號(hào)」、「空格」以及「花括號(hào)」的位置,
注意 else 和 elseif 都與前面的結(jié)束花括號(hào)在同一行。
<?phpif ($expr1) { // if body} elseif ($expr2) { // elseif body} else { // else body;}應(yīng)該 使用關(guān)鍵詞 elseif 代替所有 else if ,以使得所有的控制關(guān)鍵字都像是單獨(dú)的一個(gè)詞。
5.2. switch 和 case
標(biāo)準(zhǔn)的 switch 結(jié)構(gòu)如下代碼所示,留意括號(hào)、空格以及花括號(hào)的位置。
case 語(yǔ)句 必須 相對(duì) switch 進(jìn)行一次縮進(jìn),而 break 語(yǔ)句以及 case 內(nèi)的其它語(yǔ)句都 必須 相對(duì) case進(jìn)行一次縮進(jìn)。
如果存在非空的 case 直穿語(yǔ)句,主體里 必須 有類似 // no break 的注釋。
<?phpswitch ($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
一個(gè)規(guī)范的 while 語(yǔ)句應(yīng)該如下所示,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?phpwhile ($expr) { // structure body}標(biāo)準(zhǔn)的 do while 語(yǔ)句如下所示,同樣的,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?phpdo { // structure body;} while ($expr);5.4. for
標(biāo)準(zhǔn)的 for 語(yǔ)句如下所示,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?phpfor ($i = 0; $i < 10; $i++) { // for body}5.5. foreach
標(biāo)準(zhǔn)的 foreach 語(yǔ)句如下所示,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?phpforeach ($iterable as $key => $value) { // foreach body}5.6. try, catch
標(biāo)準(zhǔn)的 try catch 語(yǔ)句如下所示,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?phptry { // try body} catch (FirstExceptionType $e) { // catch body} catch (OtherExceptionType $e) { // catch body}6. 閉包
閉包聲明時(shí),關(guān)鍵詞 function 后以及關(guān)鍵詞 use 的前后都 必須 要有一個(gè)空格。
開始花括號(hào) 必須 寫在聲明的同一行,結(jié)束花括號(hào) 必須 緊跟主體結(jié)束的下一行。
參數(shù)列表和變量列表的左括號(hào)后以及右括號(hào)前,一定不可 有空格。
參數(shù)和變量列表中,逗號(hào)前 一定不可 有空格,而逗號(hào)后 必須 要有空格。
閉包中有默認(rèn)值的參數(shù) 必須 放到列表的后面。
標(biāo)準(zhǔn)的閉包聲明語(yǔ)句如下所示,注意其「括號(hào)」、「空格」以及「花括號(hào)」的位置。
<?php $closureWithArgs = function ($arg1, $arg2) { // body};$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // body};參數(shù)列表以及變量列表 可以 分成多行,這樣,包括第一個(gè)在內(nèi)的每個(gè)參數(shù)或變量都 必須 單獨(dú)成行,而列表的右括號(hào)與閉包的開始花括號(hào) 必須 放在同一行。
以下幾個(gè)例子,包含了參數(shù)和變量列表被分成多行的多情況。
<?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};注意,閉包被直接用作函數(shù)或方法調(diào)用的參數(shù)時(shí),以上規(guī)則仍然適用。
<?php $foo->bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3);相關(guān)閱讀:
【開發(fā)規(guī)范】老生常談的PHP編碼開發(fā)規(guī)范你懂多少?
參考資料:
https://psr.phphub.org/
總結(jié)
以上是生活随笔為你收集整理的php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【音乐拼接】mp3格式
- 下一篇: 动态规划过程