PHP每天進步一點點 代碼規範之PSR-2
- 代碼必須遵循PSR-1基本代碼規範。
- 代碼必須使用四個空格符進行縮進,而不是一個tab鍵。
- 每行應該保持在80個字符以內,軟限制必須是120個字符,但一定不能有硬性限制。
- 每個namespace命名空間聲明語句和use聲明語句塊後面,必須有一個空白行。
- 類的開始花括號({)必須寫在函數聲明後自成一行,結束花括號(})也必須寫在函數主體後自成一行。
- 方法的開始花括號({)必須寫在函數聲明後自成一行,結束花括號(})也必須寫在函數主體後自成一行。
- 在所有的屬性和方法上都必須聲明可見性(譯者註:private,protected以及public);abstract和final必須聲明在可見性之前;static必須聲明在可見性之後。
- 控制結構的關鍵詞後面必須有一個空格符,方法和函數調用一定不能有。
- 控制結構的開始花括號({)必須寫在聲明的同一行,而結束花括號(})必須寫在主體後自成一行。
- 控制結構的開始左括號({)之後一定不能有空格,右括號(})之前一定不能有空格。
1.1 例子
以下這個例子簡單的展示了以上的大部分規範。
<?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVerdor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleFunction() { if ( $a === $b ){ bar(); } elseif ( $a > $b ){ } else { } } } ?>
2. 通則
2.1 基本編碼規範
代碼必須符合PSR-1的所有規範
2.2 文件
所有PHP文件必須使用Unix LF (linefeed)作為行的結束符。
所有PHP文件必須以一個空白行結束。
純PHP代碼文件必須省略最後的 ?> 結束標簽。
2.3 行
行的長度一定不能有硬性的約束。
行長度的軟性約束一定限制在120個字符以內;如果超過此長度,代碼規範檢查器必須發出警告,一定不能報錯。
每行不應該超過80個字符;超過80個字符的行,應該被拆分成多個不超過80個字符的後續行。
在非空白行的後面一定不能有多余的空格符。
空行可以用來改善可讀性和區分相關的代碼塊。
每行一定不能多余一條語句。
2.4 縮進
代碼必須使用四個空格符縮進,一定不能使用tab鍵。
2.5 關鍵字和True/False/Null
PHP關鍵字必須全部小寫。
PHP常量true,false和null必須全部小寫。
3. 命名空間以及Use聲明
存在命名空間時,其後面必須有一個空白行。
所有的use,必須在命名空間後聲明。
每條use聲明語句,必須只有一個use關鍵字。
use聲明語句塊後面必須有一個空白行。
例如:
<?php
namesapce Vendor\Package;
use FooClass;
//
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
{
// 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
}
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 = []
) {
// method body
}
}
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直穿語句,則必須有一個類似// 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
<?php
try {
// try body
} catch (FirstExceptionType $e) {
// catch body
} catch (OtherExceptionType $e) {
// catch body
}```
PHP每天進步一點點 代碼規範之PSR-2