====== PSR-12: Extended Coding Style ====== --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-06-23// 本章は、若干の補足を加筆してはいるものの単に[[https://www.php-fig.org/psr/|PSRのサイト]]を日本語に翻訳したものに過ぎません。英語が堪能な方は原文をご参照下さい。翻訳に当たっては、基本的に機械翻訳を使い、理解できない部分は独断で意訳しております。拙い訳では御座いますが恥を忍んで投稿しておりますので、ご指摘など御座いましたらコメントを頂ければ幸いです。 関連記事 * [[psr:top|PSR - PHP標準勧告]] * [[psr:psr1|PSR-1: Basic Coding Standard - 基本コーディング規約]] * [[psr:psr3|PSR-3: Logger Interface - ロガーインターフェイス]] * [[psr:psr4|PSR-4: Autoloading Standard - オートローディング規約]] * [[psr:psr5|PSR-5: PHPDoc Standard(Draft) - PHPDoc規約]] * [[psr:psr6|PSR-6: Caching Interface - キャッシングインターフェイス]] * [[psr:psr7|PSR-7: HTTP Message Interface - HTTPメッセージインターフェイス]] * [[psr:psr11|PSR-11: Container Interface - コンテナインターフェイス]] * PSR-12: Extended Coding Style - 拡張コーディングスタイル * [[psr:psr13|PSR-13: Link definition interfaces - リンク定義インターフェース]] * [[psr:psr14|PSR-14: Event Dispatcher - イベントディスパッチャー]] * [[psr:psr15|PSR-15: HTTP Server Request Handlers - HTTPサーバーリクエストハンドラー]] * [[psr:psr16|PSR-16: Common Interface for Caching Libraries - キャッシングライブラリのための共通インターフェース]] * [[psr:psr17|PSR-17: HTTP Factories - HTTPファクトリー]] * [[psr:psr18|PSR-18: HTTP Client - HTTPクライアント]] * [[psr:psr19|PSR-19: PHPDoc tags(Draft) - PHPDocタグ]] ----- ====== PSR-12: 拡張コーディングスタイル ====== --- // 原文より翻訳 [[https://www.php-fig.org/psr/psr-12/|PSR-12: Extended Coding Style]] 2020-06-30 現在 // このドキュメントのキーワード ''MUST'' , ''MUST NOT'' , ''REQUIRED'' , ''SHALL'' , ''SHALL NOT'' , ''SHOULD'' , ''SHOULD NOT'' , ''RECOMMENDED'' , ''MAY'' 及び ''OPTIONAL'' は、 [[https://www.ietf.org/rfc/rfc2119.txt|RFC 2119]]で説明されているように解釈して下さい。 > **RFC 2119の説明** > ''MUST'', ''REQUIRED'', ''SHALL'' --- 絶対必要 > ''MUST NOT'', ''SHALL NOT'' --- 絶対禁止 > ''SHOULD'', ''RECOMMENDED'' --- 推奨(但し、無視できる特定の正当な理由が存在するかもしれない) > ''SHOULD NOT'' --- 推奨できない(但し、許可できる特定の正当な理由が存在するかもしれない) > ''MAY'', ''OPTIONAL'' --- オプション \\ ===== 1. 概観 ====== この仕様は、コーディングスタイルガイドである[[https://www.php-fig.org/psr/psr-2/|PSR-2]]を継承し、拡張して、置き換えました。基本的なコーディング標準である[[https://www.php-fig.org/psr/psr-1/|PSR-1]]への準拠を必要とします。 [[https://www.php-fig.org/psr/psr-2/|PSR-2]]と同様に、この仕様の目的は、さまざまな作成者のコードを読む時の認識の摩擦を減らすことです。 これは、共有された一連のルールと、PHPコードのフォーマット方法に関する期待を列挙することによって行われます。このPSRは、コーディングスタイルツールが実装できる一連の方法を提供することを目指しており、プロジェクトは遵守を宣言でき、開発者は異なるプロジェクト間で簡単にこれを関連付けることができます。さまざまな作成者が複数のプロジェクトにわたって共同作業を行う場合、それらすべてのプロジェクト間で1つのガイドラインセットを使用すると役立ちます。従って、このガイドの利点はルール自体ではなく、それらのルールの共有にあります。 >''上記の原文'' >Like PSR-2, the intent of this specification is to reduce cognitive friction when scanning code from different authors. It does so by enumerating a shared set of rules and expectations about how to format PHP code. This PSR seeks to provide a set way that coding style tools can implement, projects can declare adherence to and developers can easily relate to between different projects. When various authors collaborate across multiple projects, it helps to have one set of guidelines to be used among all those projects. Thus, the benefit of this guide is not in the rules themselves but the sharing of those rules. [[https://www.php-fig.org/psr/psr-2/|PSR-2]]は2012年に承認され、それ以降、PHPには多くの変更が加えられ、それはコーディングスタイルガイドラインに影響するものでした。[[https://www.php-fig.org/psr/psr-2/|PSR-2]]は、執筆時点では存在していたPHP機能の非常に包括的なものでしたが、新しい機能には非常に解釈の自由があります。従って、このPSRは、PSR-2の内容をより近代的なコンテキストで明確にし、新しい機能を利用できるようにして、そのエラッタ(errata)をPSR-2にバインドすることを目的としています。 === 以前の言語バージョン === このドキュメント全体を通して、プロジェクトでサポートされているPHPのバージョンにインストラクションが存在しない場合、それらは無視できます( ''MAY'' )。 === 例 === この例では、以下で説明するルールの幾つかを簡単な概要として取り上げています: $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } \\ ===== 2. 全般 ====== ==== 2.1 基本コーディング規約 ===== コードは、[[https://www.php-fig.org/psr/psr-1/|PSR-1]]で概説されているすべてのルールに従う必要があります( ''MUST'' )。 PSR-1の「StudlyCaps」という用語は、各単語の最初の文字が最初の文字を含めて大文字になっている PascalCase として解釈する必要があります( ''MUST'' )。 \\ ==== 2.2 ファイル ===== すべてのPHPファイルは、Unix LF(ラインフィード)の行末のみを使用する必要があります( ''MUST'' )。 すべてのPHPファイルは、空白以外の行で終わり、単一のLFで終端する必要があります( ''MUST'' )。 PHPのみを含むファイルからは、終了タグ( ''?>'' )を省略しなければなりません( ''MUST'' )。 \\ ==== 2.3 ライン ===== 行の長さに厳しい制限があってはなりません( ''MUST NOT'' )。 行の長さのソフトな制限は120文字でなければなりません( ''MUST'' )。   行は80文字を超えるべきではありません( ''SHOULD NOT'' )。それより長い行は、それぞれ80文字以下の複数の後続行に分割すべきです。( ''SHOULD'' )。 行末に空白があってはいけません( ''MUST NOT'' )。 明示的に禁止されている場合を除き、読みやすさを向上させ、コードの関連ブロックを示すために、空行を追加できます( ''MAY'' )。 1行に複数のステートメントがあってはなりません( ''MUST NOT'' )。 \\ ==== 2.4 インデント ===== コードは、インデントレベル毎に4スペースのインデントを使用する必要があり( ''MUST'' )、インデントにタブを使用してはなりません( ''MUST NOT'' )。 \\ ==== 2.5 キーワードとタイプ ===== すべてのPHPで予約されている[[https://www.php.net/manual/en/reserved.keywords.php|キーワード]]と[[https://www.php.net/manual/en/reserved.other-reserved-words.php|タイプ]]は小文字でなければなりません( ''MUST'' )。 将来のPHPバージョンに追加される新しいタイプとキーワードは、小文字でなければなりません( ''MUST'' )。 Short form of type keywords MUST be used i.e. bool instead of boolean, int instead of integer etc. タイプのキーワードは短い形式を使用する必要があります( ''MUST'' )。つまり、''boolean'' の代わりに ''bool''、''integer'' の代わりに ''int'' などです。 \\ ===== 3. Declare文、名前空間、およびインポート文 ====== PHPファイルのヘッダーは、いくつかの異なるブロックで構成されている場合があります。存在するなら、以下の各ブロックは単一の空行で区切る必要があり( ''MUST'' )、各ブロックは空行を含んではいけません( ''MUST NOT'' )。 各ブロックは、以下にリストされている順序でなければなりませんが( ''MUST'' )、関連のないブロックは省略できます。 * 開始タグ( ''''上記の原文'' >When the opening \\ 原文自体が分かり難いが、これは下例のような場合以外は '' インポート文は常に完全修飾されていなければならないので、決してバックスラッシュで始めてはなりません( ''MUST NOT'' )。 次の例は、すべてのブロックの完全なリストを示しています: 深度が2を超える複合名前空間は使用してはなりません( ''MUST NOT'' )。 従って、許容される最大の合成深度は次のとおりです: また、以下は許可されません: PHPの開始タグと終了タグの外側のマークアップを含むファイルで厳密なタイプ( strict_types )を宣言したい時、宣言はファイルの最初の行にあり、PHPの開始タグ、厳密なタイプの宣言と終了タグ を含める必要があります( ''MUST'' )。 例えば: declare文にはスペースを含めず( ''MUST'' )、正確に ''declare(strict_types=1)''(オプションでセミコロンターミネータの使用可)とする必要があります( ''MUST'' )。 ブロックdeclare文は許可され、以下のようにフォーマットする必要があります( ''MUST'' )。中括弧( ''{'' ''}'' )の位置と間隔に注意してください: declare(ticks=1) { // some code } \\ ===== 4. クラス、プロパティ、メソッド ====== 「クラス」という用語は、すべてのクラス、インターフェース、およびトレイトを指します。 どんな閉じ中括弧( ''}'' )の後にも、同じ行にコメントまたはステートメントを続けてはなりません( ''MUST NOT'' )。 新しいクラスをインスタンス化するとき、コンストラクターに渡される引数がない場合でも、丸括弧( ''()'' )は常に存在している必要があります( ''MUST'' )。 new Foo(); \\ ==== 4.1 拡張および実装 ===== ''extends'' と ''implements'' キーワードは、クラス名と同じ行で宣言する必要があります( ''MUST'' )。 クラスの開き中括弧( ''{'' )は独自の行に配置する必要があります( ''MUST'' )。クラスの閉じ中括弧( ''}'' )は、本文の後の次の行に配置する必要があります( ''MUST'' )。 開き中括弧( ''{'' )は独自の行になければならず( ''MUST'' )、前後に空行があってはなりません( ''MUST NOT'' )。 閉じ中括弧( ''}'' )は独自の行になければならず( ''MUST'' )、前に空行があってはなりません( ''MUST NOT'' )。 ''implements'' のリスト(インターフェースの場合)および ''extends'' は複数の行に分割されてもよく( ''MAY'' )、後続の各行は1回インデントされます。 そうする場合、実装リストの最初の項目は次の行になければならず( ''MUST'' )、1行に1つのインターフェースだけにする必要があります( ''MUST'' )。 \\ ==== 4.2 トレイトの使用 ===== トレイトを実装するためにクラス内で使用される ''use'' キーワードは、クラスの開き中括弧( ''{'' )の後の次の行で宣言する必要があります( ''MUST'' )。 クラスにインポートされる個々のトレイトは1行に1つずつ含める必要があり( ''MUST'' )、各インクルードには独自の ''use'' インポート文が必要です( ''MUST'' )。 クラスが ''use'' インポート文の後に何もない場合、クラスの閉じ括弧は、useインポート文の後の次の行になければなりません( ''MUST'' )。 それ以外の場合は、''use'' インポート文の後に空行が必要です( ''MUST'' )。 ''insteadof'' と ''as'' 演算子を使用するときは、インデント、空白、改行に注意して、次のように使用する必要があります。 \\ ==== 4.3 プロパティと定数 ===== すべてのプロパティで可視性を宣言する必要があります( ''MUST'' )。 プロジェクトのPHPの最小バージョンが定数の可視性(PHP 7.1以降)をサポートしている場合は、すべての定数で可視性を宣言する必要があります( ''MUST'' )。 プロパティの宣言に ''var'' キーワードを使用してはなりません( ''MUST NOT'' )。 ステートメントごとに複数のプロパティを宣言することはできません( ''MUST NOT'' )。 protected または private な可視性を示すために、プロパティ名の前に単一のアンダースコア( ''_'' )を付けてはいけません( ''MUST NOT'' )。つまり、アンダースコア( ''_'' )のプレフィックスは明示的に意味を持ちません。 型宣言とプロパティ名の間にはスペースが必要です( ''MUST'' )。 プロパティ宣言は次のようになります: \\ ==== 4.4 メソッドと関数 ===== すべてのメソッドで可視性を宣言する必要があります( ''MUST'' )。 protected または private な可視性を示すために、メソッド名の前に単一のアンダースコア( ''_'' )を付けてはいけません( ''MUST NOT'' )。つまり、アンダースコア( ''_'' )のプレフィックスは明示的に意味を持ちません。 メソッド名と関数名は、その後にスペースを入れて宣言してはなりません( ''MUST NOT'' )。開き中括弧( ''{'' )は独自の行に配置する必要があり( ''MUST'' )、閉じ中括弧( ''}'' )は本文に続く次の行に配置する必要があります( ''MUST'' )。開き丸括弧( ''('' )の後にスペースがあってはならず( ''MUST NOT'' )、閉じ丸括弧( '')'' )の前にスペースがあってはなりません( ''MUST NOT'' )。 メソッド宣言は次のようになります。丸括弧( ''('' '')'' )、カンマ、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください: 関数宣言は次のようになります。丸括弧( ''('' '')'' )、カンマ、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください: \\ ==== 4.5 メソッドと関数の引数 ===== 引数リストでは、各カンマの前にスペースがあってはならず( ''MUST NOT'' )、各カンマの後にスペースが1つなければなりません( ''MUST'' )。 デフォルト値を持つメソッドと関数の引数は、引数リストの最後に配置する必要があります( ''MUST'' )。 引数リストは複数の行に分割される場合があり( ''MAY'' )、後続の各行は1回インデントされます。そうするとき、リストの最初の項目は次の行になければならず( ''MUST'' )、1行に1つの引数のみがなければなりません( ''MUST'' )。 引数リストが複数の行に分割されている場合、閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、同じ行に一緒に配置する必要があります( ''MUST'' )。 戻り値の型宣言が存在する場合、コロンとそれに続く型宣言の間に1つのスペースが必要です( ''MUST'' )。コロンと型宣言は、引数リストの閉じ丸括弧( '')'' )と同じ行になければなりません( ''MUST'' )。その時2つの文字( '')'' と '':'' )の間にスペースは入れません。 null許容型宣言では、疑問符( ''?'' )と型の間にスペースがあってはなりません( ''MUST NOT'' )。 参照演算子( ''&'' )を引数の前に使用する場合、前の例のように、''&'' の後にスペースがあってはなりません( ''MUST NOT'' )。 可変長引数の ''...'' 演算子と引数名の間にスペースがあってはいけません( ''MUST NOT'' ): public function process(string $algorithm, ...$parts) { // processing } 参照演算子と可変長引数の ''...'' 演算子の両方を組み合わせる場合、それらの2つの間にスペースがあってはなりません( ''MUST NOT'' ): public function process(string $algorithm, &...$parts) { // processing } \\ ==== 4.6 abstract, final, and static ===== ''abstract'' 及び ''final'' が存在する場合、それらは可視性宣言の前になければなりません( ''MUST'' )。 ''static'' が存在する場合、それは可視性宣言の後に来なければなりません( ''MUST'' )。 \\ ==== 4.7 メソッドと関数の呼び出し ===== メソッドまたは関数の呼び出しを行うときは、メソッドまたは関数の名前と開き丸括弧( ''('' )の間にスペースがあってはならず( ''MUST NOT'' )、開き丸括弧( ''('' )の後にスペースがあってはならず( ''MUST NOT'' )、閉じ丸括弧( '')'' )の前にスペースがあってはなりません( ''MUST NOT'' )。引数リストでは、各カンマの前にスペースがあってはならず( ''MUST NOT'' )、各カンマの後にスペースが1つなければなりません( ''MUST'' )。 bar($arg1); Foo::bar($arg2, $arg3); 引数リストは複数の行に分割される場合があり( ''MAY'' )、後続の各行は1回インデントされます。そうするとき、リストの最初の項目は次の行になければならず( ''MUST'' )、1行に1つの引数のみがなければなりません( ''MUST'' )。(無名関数または配列の場合のように)単一の引数が複数行に分割されても、引数リスト自体の分割にはなりません。 bar( $longArgument, $longerArgument, $muchLongerArgument ); get('/hello/{name}', function ($name) use ($app) { return 'Hello ' . $app->escape($name); }); \\ ===== 5. 制御構造 ====== 制御構造の一般的なスタイル規則は次のとおりです: * 制御構造キーワードの後にスペースが1つ必要です( ''MUST'' ) * 開き丸括弧( ''('' )の後にスペースがあってはいけません( ''MUST NOT'' ) * 閉じ丸括弧( '')'' )の前にスペースがあってはいけません( ''MUST NOT'' ) * 閉じ丸括弧( '')'' )と開き中括弧( ''{'' )の間にスペースが1つ必要です( ''MUST'' ) * 構造本体は一回インデントする必要があります( ''MUST'' ) * 本体は開き中括弧( ''{'' )の後の次の行になければなりません( ''MUST'' ) * 閉じ中括弧( ''}'' )は、本文の後の次の行になければなりません( ''MUST'' ) 各構造の本体は中括弧( ''{'' ''}'' )で囲む必要があります( ''MUST'' )。これにより、構造の外観が標準化され、新しい行が本文に追加されるときにエラーが発生する可能性が低くなります。 \\ ==== 5.1 if, elseif, else ===== ''if'' 構造は次のようになります。 丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。そして、''else'' と ''elseif'' は前の本体の閉じ中括弧( ''}'' )と同じ行にあります。 すべての制御キーワードが単一の単語のように見えるように、''else if'' の代わりにキーワード ''elseif'' を使用すべきです( ''SHOULD'' )。 丸括弧( ''('' '')'' )内の式は複数の行に分割される場合があり( ''MAY'' )、後続の各行は少なくとも1回インデントされます。その場合、最初の条件は次の行になければなりません( ''MUST'' )。閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、一緒の行に配置する必要があります( ''MUST'' )。条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければなりません( ''MUST'' )。 \\ ==== 5.2 switch, case ===== ''switch'' の構造は次のようになります。丸括弧( ''('' '')'' )、スペース、中括弧( ''{'' ''}'' )の配置に注意してください。''case'' ステートメントは ''switch'' から一回インデントする必要があり( ''MUST'' )、''break'' キーワード(または他の終了キーワード)は ''case'' 本体と同じレベルでインデントする必要があります( ''MUST'' )。空ではないケース本体でフォールスルーが意図的である場合、''// no break''などのコメントが必要です( ''MUST'' )。 丸括弧( ''('' '')'' )内の式は複数の行に分割される場合があり( ''MAY'' )、後続の各行は少なくとも1回インデントされます。その場合、最初の条件は次の行になければなりません( ''MUST'' )。閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、一緒の行に配置する必要があります( ''MUST'' )。条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければなりません( ''MUST'' )。 \\ ==== 5.3 while, do while ===== ''while'' ステートメントは次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 丸括弧( ''('' '')'' )内の式は複数の行に分割される場合があり( ''MAY'' )、後続の各行は少なくとも1回インデントされます。その場合、最初の条件は次の行になければなりません( ''MUST'' )。閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、一緒の行に配置する必要があります( ''MUST'' )。条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければなりません( ''MUST'' )。 同様に、''do while'' ステートメントは次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 丸括弧( ''('' '')'' )内の式は複数の行に分割される場合があり( ''MAY'' )、後続の各行は少なくとも1回インデントされます。その場合、最初の条件は次の行になければなりません( ''MUST'' )。条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければなりません( ''MUST'' )。 \\ ==== 5.4 for ===== ''for'' ステートメントは次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 丸括弧( ''('' '')'' )内の式は複数の行に分割される場合があり( ''MAY'' )、後続の各行は少なくとも1回インデントされます。その場合、最初の条件は次の行になければなりません( ''MUST'' )。閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、一緒の行に配置する必要があります( ''MUST'' )。 \\ ==== 5.5 foreach ===== ''foreach'' ステートメントは次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 $value) { // foreach body } \\ ==== 5.6 try, catch, finally ===== ''try-catch-finally'' ブロックは次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 \\ ===== 6. オペレーター ====== 演算子のスタイルルールは、アリティ(演算子が取るオペランドの数)ごとにグループ化されています。 演算子の周囲にスペースが許可されている場合、読みやすさの目的で複数のスペースを使用できます( ''MAY'' )。 ここで説明されていないすべての演算子は未定義のままです。 \\ ==== 6.1. 単項演算子 ===== インクリメント/デクリメント演算子は、演算子とオペランドの間にスペースがあってはいけません( ''MUST NOT'' )。 $i++; ++$j; 型キャスト演算子は丸括弧( ''('' '')'' )内にスペースがあってはいけません( ''MUST NOT'' ): $intValue = (int) $input; \\ ==== 6.2. 二項演算子 ===== すべての二項演算子(算術演算子、比較演算子、代入演算子、ビット演算子、論理演算子、文字列演算子、および型演算子)の前後には、少なくとも1つのスペースが必要です( ''MUST'' ): if ($a === $b) { $foo = $bar ?? $a ?? $b; } elseif ($a > $b) { $foo = $a + $b * $c; } \\ ==== 6.3. 三項演算子 ===== 条件演算子は、単に三項演算子とも呼ばれ、''?'' と '':'' の文字の前後に少なくとも1つのスペースがなければなりません( ''MUST'' ): $variable = $foo ? 'foo' : 'bar'; 条件演算子の中央のオペランドが省略されている場合、演算子は他の二項比較演算子と同じスタイル規則に従う必要があります( ''MUST'' ): $variable = $foo ?: 'bar'; \\ ===== 7. クロージャー ====== クロージャーは、''function'' キーワードの後にスペースを使用し、''use'' キーワードの前後にスペースを使用して宣言する必要があります( ''MUST'' )。 開き中括弧( ''{'' )は同じ行に配置する必要があり( ''MUST'' )、閉じ中括弧( ''}'' )は本文に続く次の行に配置する必要があります( ''MUST'' )。 引数リストまたは変数リストの開き丸括弧( ''('' )の後にスペースがあってはならず( ''MUST NOT'' )、引数リストまたは変数リストの閉じ丸括弧( '')'' )の前にスペースがあってはなりません( ''MUST NOT'' )。 引数リストと変数リストでは、各カンマの前にスペースがあってはならず( ''MUST NOT'' )、各カンマの後にスペースが1つなければなりません( ''MUST'' )。 デフォルト値を持つクロージャー引数は、引数リストの最後に配置する必要があります( ''MUST'' )。 戻り値の型が存在する場合、通常の関数とメソッドと同じルールに従う必要があります( ''MUST'' )。''use'' キーワードが存在する場合、コロン( '':'' )は、''use'' リストの閉じ丸括弧( '')'' )の後に続く必要があります( ''MUST'' )。その時、2つの文字( '')'' と '':'' )の間にスペースは入れません。 クロージャー宣言は次のようになります。丸括弧( ''('' '')'' )、スペース、および中括弧( ''{'' ''}'' )の配置に注意してください。 引数リストと変数リストは、複数の行に分割されてもよく( ''MAY'' )、後続の各行は1回インデントされます。その場合、リストの最初の項目は次の行になければならず( ''MUST'' )、1行に1つの引数または変数のみが存在しなければなりません( ''MUST'' )。 最後のリスト(引数または変数に関係なく)が複数の行に分割されている場合、閉じ丸括弧( '')'' )と開き中括弧( ''{'' )は、それらの間に1つのスペースを入れて、同じ行に配置する必要があります( ''MUST'' )。 以下は、複数行に分割された引数リストと変数リストがある場合とない場合のクロージャーの例です。 クロージャーが関数またはメソッドの呼び出しで引数として直接使用される場合にも、フォーマッティング・ルールが適用されることに注意してください。 bar( $arg1, function ($arg2) use ($var1) { // body }, $arg3 ); \\ ===== 8. 匿名クラス ====== 匿名クラスは、上記のセクションのクロージャーと同じガイドラインと原則に従う必要があります( ''MUST'' )。 実装インターフェースのリストが折り返されない限り、開き中括弧( ''{'' )は ''class'' キーワードと同じ行に置くことができます( ''MAY'' )。インターフェイスのリストが折り返されている場合、中括弧( ''('' '')'' )は最後のインターフェイスの直後の行に配置する必要があります( ''MUST'' )。 \\