RitoLabo

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

  • 公開:
  • 更新:
  • カテゴリ: PHP PSR
  • タグ: PHP,PSR,PSR-1,PSR-2

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

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

目次
  1. コーディングスタイル・形式
    1. 基本的なコーディング標準
    2. ファイル
      1. 文字数
      2. 空白
      3. ステートメント
    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
{

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

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

拡張と実装

  • extendsimplementsはクラス名と同じ行で宣言する。
  • クラスの開始波括弧(オープニングブレース) { は次の行にそれのみで記述する。
  • クラスの終了波括弧(クローズドブレース) } は本文の次の行に記述する。
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

  • abstractfinalは可視性の宣言の前に記述する。
  • 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