1. 程式人生 > >PHP每天進步一點點 代碼規範之PSR-2

PHP每天進步一點點 代碼規範之PSR-2

abs bstr oob class turn 表示 interface 名稱 限制

1.概覽
  1. 代碼必須遵循PSR-1基本代碼規範。
  2. 代碼必須使用四個空格符進行縮進,而不是一個tab鍵。
  3. 每行應該保持在80個字符以內,軟限制必須是120個字符,但一定不能有硬性限制。
  4. 每個namespace命名空間聲明語句和use聲明語句塊後面,必須有一個空白行。
  5. 類的開始花括號({)必須寫在函數聲明後自成一行,結束花括號(})也必須寫在函數主體後自成一行。
  6. 方法的開始花括號({)必須寫在函數聲明後自成一行,結束花括號(})也必須寫在函數主體後自成一行。
  7. 在所有的屬性和方法上都必須聲明可見性(譯者註:private,protected以及public);abstract和final必須聲明在可見性之前;static必須聲明在可見性之後。
  8. 控制結構的關鍵詞後面必須有一個空格符,方法和函數調用一定不能有。
  9. 控制結構的開始花括號({)必須寫在聲明的同一行,而結束花括號(})必須寫在主體後自成一行。
  10. 控制結構的開始左括號({)之後一定不能有空格,右括號(})之前一定不能有空格。

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