1. Home
  2. PHP
  3. PSR
  4. 【PHP】PSR-2 Coding Style Guide(コーディングスタイルガイド)

【PHP】PSR-2 Coding Style Guide(コーディングスタイルガイド)

  • 公開日
  • 更新日
  • カテゴリ:PSR
  • タグ:PHP,PSR,PSR-1,PSR-2
【PHP】PSR-2 Coding Style Guide(コーディングスタイルガイド)

PSR(PHP 標準勧告)

  1. 概要
  2. PSR-1 Basic Coding Standard
  3. PSR-3 Logger Interface
  4. PSR-4 Autoloader
  5. PSR-6 Caching Interface
  6. PSR-7 HTTP Message Interface
  7. PSR-11 Container Interface
  8. PSR-12 Extended Coding Style
  9. PSR-13 Hypermedia Links
  10. PSR-15 HTTP Handlers
  11. PSR-16 Simple Cache
  12. PSR-17 HTTP Factories
  13. PSR-18 HTTP Client

2019 年 8 月 10 日現在、PSR-2 は非推奨としてマークされています。 PSR-12 が代替として推奨されるようになりました。

Deprecated - As of 2019-08-10 PSR-2 has been marked as deprecated. PSR-12 is now recommended as an alternative.

https://www.php-fig.org/psr/psr-2/

PSR-2 は、PHP における基本的なコーディング標準であるPSR-1 を拡張し、PHP コードをどのようにフォーマットするかについての共通の規則を定めています。

このベーシックなガイドラインをメンバーと共有しプロジェクトを進める事で、コードの共通化や、ソースコードリーディングの時間短縮を図る事ができます。

Contents

  1. コーディングスタイル・形式
    1. 基本的なコーディング標準
    2. ファイル
    3. インデント
    4. キーワードと True / False / Null
  2. 名前空間と宣言
  3. クラス・プロパティ・メソッド
    1. 拡張と実装
    2. プロパティ
    3. メソッド
    4. メソッドの引数
    5. abstract/final/static
    6. メソッドと関数のコール
  4. 制御構造
    1. if/elseif/else
    2. switch/case
    3. while/do while
    4. for
    5. foreach
    6. try catch
  5. クロージャー
  6. その他
    1. 未来の PSR-2 拡張要素
    2. 調査・アンケート

コーディングスタイル・形式

General セクションでは、基本のコーディングスタイルやファイルの形式について定めています。

基本的なコーディング標準

コードは、PSR-1 に記載されているすべてのルールに従う。

ファイル

  • すべての PHP ファイルは Unix LF(改行)行末を使用する。
  • すべての PHP ファイルは空白行で終わらせる。
  • PHP のみのファイルの場合、終了タグ?>は省略する。

このセクションでは、行レベルでの記述(1行につき)について定めています。

文字数

1行にコーディングする文字数に厳しい制限は設けない。

1行中の文字数限界値は 120 文字とし、エディターで自動チェックできる場合はそこで警告を出すべきではあるが、あくまでもソフトな限界値なので、エラーは出さない。

とはいえ、1行の文字数は 80 文字を超えない。それよりも長い場合は、複数行に分割して記述する。

空白

  • 空白ではない行の末尾に空白を連続して入力しない。
  • 可読性を向上させる為、関連するコードブロックを示す為に空白行を追加する事は OK

ステートメント

1行に複数のステートメント(宣言)は書かない。

インデント

インデントはタブではなく、4 つのスペースを使用する。

スペースをタブと混合しないで空白のみを使用すれば、差分、パッチ、履歴、注釈の問題を回避できる。調整の為に細かいサブインデントを挿入するのも簡単になる。

キーワードと True / False / Null

  • PHP のキーワード は小文字で記述する。
  • PHP の定数「true 」「false 」「null 」は小文字で記述する。

名前空間と宣言

  • namespace 宣言の後に空白行を 1 つ設ける。
  • 全ての use 宣言は namespace 宣言の後に記述する。
  • use 宣言ごとに 1 つのキーワードが必要。
  • use ブロックの後には空白行が 1 つ必要。
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Facades\HogeNotification AS Hoge;

class SampleController extends Controller
{

クラス・プロパティ・メソッド

このセクションでのクラスは、全てのクラス、インターフェイス、特性を指しています。

拡張と実装

  • extends と implements はクラス名と同じ行で宣言する。
  • クラスの開始波括弧(オープニングブレース) { は次の行にそれのみで記述する。
  • クラスの終了波括弧(クローズドブレース) } は本文の次の行に記述する。
class MyClass extends YouClass implements SheClass, HeClass
{

}

複数の implements は複数行に分ける事ができる。そうする場合は、1 つめから改行を行い、1行につき 1 つの運ターフェイスを記述する。

class ClassName extends ParentClass implements
  \ArrayAccess,
  \Countable,
  \Serializable
{

プロパティ

すべてのプロパティで可視性を宣言する。

class SampleClass
{
  public $foo;
  private $bar;
  protected $haystack;
}
  • プロパティの宣言に var は使わない。
  • 1 つのステートメントで 2 つ以上のプロパティは定義しない。
class SampleClass
{
  public $foo, $bar; // ← この書き方はダメ
}

プロパティ名には、暗黙の private を示す為に接頭辞アンダースコアを付ける事はしない。

メソッド

  • すべてのメソッドで可視性を宣言する。
  • メソッド名には、暗黙の private を示すような接頭辞アンダースコアは付けない。
  • メソッド名の後ろにはスペースを入れない。
  • 開始/終了波括弧は単体それのみで1行に記述する。
  • 開始括弧の後ろにはスペースを入れない。
  • 閉じ括弧の前にはスペースを入れない。
class SampleController
{
    public function index($arg1, $arg2)
    {

    }

メソッドの引数

  • 引数を記述する際には、カンマの前にスペースは入れない。
  • カンマの後にスペースを 1 つ入れる。
  • デフォルト値を持つメソッド引数は最後に置く。
public function index($arg1, &$arg2, $arg3 = [])
{

}

引数リストは複数の行に分割 OK 。その場合は 1 つめから改行し、1行に 1 つの引数を記述する。また、その場合、閉じ括弧と開始波括弧は 1 つのスペースを挟んで 1行に記述する

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

abstract/final/static

  • abstract と final は可視性の宣言の前に記述する。
  • static は可視性の宣言の後に記述する。
abstract class ClassName
{
    protected static $foo;
  
    abstract protected function zim();
  
    final public static function bar()
    {
      // method body
    }
}

メソッドと関数のコール

  • メソッドや関数を呼び出す時は、メソッド・関数名と開始括弧の間にスペースを入れない。
  • 開始括弧の後にスペースを入れない。
  • 閉じ括弧の前にスペースを入れない。
  • 引数リストでは各カンマの前にスペースを入れない。
  • 引数リストでは各カンマの後ろにスペースを 1 つ入れる。
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);

引数リストは複数行に分割 OK 。その場合は第一引数も改行し、1行に 1 つの引数を記述する。

<?php
$foo->bar(
  $longArgument,
  $longerArgument,
  $muchLongerArgument
);

制御構造

制御構造とは、if や foreach, try-catch などの、制御を行う処理の構造の事です。

そんな制御構造の一般的なスタイルルールは以下の通り

  • キーワードの後には 1 つのスペースを入れる。
  • 終了括弧と開始波括弧の間には 1 つのスペースを入れる。
  • 構造を形成する際はインデントを入れる。
  • 終了括弧は次の行で単体に記述する。
  • 制御は中括弧(波括弧 {} )で囲む。

if/elseif/else

if の書式は以下の通り。

<?php

if ($foo) {

} elseif ($bar) {

} else {

}
  • 括弧、スペース、および中括弧の配置に注意する。
  • else と elseif は前のボディの閉じた終了波括弧と同じ行にある。
  • 全ての制御キーワードが単一のように見えるように、else if ではなく elseif を使う。

switch/case

switch 構造は以下の通り。

<?php

switch ($hoge) {
    case 0:
        echo '通常パターン。breakします。';
        break;
    case 1:
        echo 'no breakパターン。処理は継続されます。';
    // no break
    case 2:
    case 3:
    case 4:
        echo 'returnパターン, breakの代わりにreturnします。';
        return;
    default:
        echo 'Default case';
        break;
}
  • 括弧、スペース、中括弧の配置に注意する。
  • case 文は switch から一度インデントする。
  • break キーワード(または他の終了キーワード)は case 本体と同じレベルでインデントする。
  • 空ではないケース本体でフォールスルーを行う場合は // no break などのコメントを記述する。

while/do while

while 構造は以下の通り。

<?php

while ($expr) {
    // structure body
}

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

括弧、スペース、中括弧の配置に注意する。

for

for 構造は以下の通り。

<?php

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

括弧、スペース、中括弧の配置に注意する。

foreach

foreach 構造は以下の通り。

<?php

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

括弧、スペース、中括弧の配置に注意する。

try catch

try catch ブロックは以下の通り。

<?php

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

括弧、スペース、中括弧の配置に注意する。

クロージャー

クロージャについて定義したセクションです。

  • function キーワードの後にスペースを入れ、キーワードの前後にスペースを入れて宣言する。
  • 開始波括弧は同じ行に記述する。
  • 終了波括弧はボディに続く次の行に移動し記述する。
  • 引数リストと変数リストには、各コンマの前にスペースを入れない。
  • 各コンマの後にスペースを 1 つ入れる。
  • デフォルト値を用いたクロージャ引数は、引数リストの最後に記述する。
  • 括弧、スペース、中括弧の配置に注意する。

上記を踏まえたクロージャ宣言のベストライティングは以下の通り。

<?php

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

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

引数リストと変数リストは複数の行に分割できる。その場合の書式については以下の通り。

  • 各行は 1 回インデントを入れる。
  • 終了リスト(引数または変数のいずれか)が複数の行に分割されている場合、閉じ括弧と開始波括弧は、それらの間に 1 つのスペースを入れてそれぞれの行に配置する。

以下は、複数の行に分割された引数リストと変数リストがある場合とない場合のクロージャの例です。

<?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
);

その他

このセクションは、コーディングスタイルではなく、PSR-2 策定に関する記述です。

未来の PSR-2 拡張要素

このガイド(PSR-2)で意図的に省略されたスタイルと実践の多くの要素があります。 これには以下のものが含まれます。

  • グローバル変数とグローバル定数の宣言
  • 関数の宣言
  • 演算子と代入
  • ライン間アライメント
  • コメントとドキュメントブロック
  • クラス名の接頭辞と接尾辞
  • ベストプラクティス

スタイルや実践のそれらの要素や他の要素に対処するために、このガイドを改訂し、拡張することができる。

調査・アンケート

PSR-2 策定のために、ワークグループはメンバーに対してコーディングスタイルについてのアンケートを行っているそうです。

その調査項目・回答結果についての全てのデータが公表されています。
https://www.php-fig.org/psr/psr-2/#appendix-a-survey

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級