PHPコーディング規約について知る

# PHP-FIG
The PHP Framework Interop Gruop
https://www.php-fig.org/
ある程度のコーディングルールについて ｲｲﾈ! がまとめられた場所

# ACCEPTED なルール

## PSR-1: Basic Coding Standard
### 概要
共有PHPコード間の高度な技術的相互運用性を確保するために必要な標準コーディング要素と見なされるべきもの
### タグ
ファイルは、<?php ?> か <?= ?> のどちらかを使用する必要がある
### 文字コード
ファイルは、文字コードについてBOMなしUTF-8を使用する必要がある
### Side Effects
ファイルは、以下のいずれかを行うべきだが、両方を行うべきではない
　クラス、関数、定数などを宣言する
　出力の生成、設定ファイルの変更など
Side Effects = クラス、関数、定数などの宣言に直接関連しないロジックの実行、ファイルを include するだけ
出力の生成、require または include の明示的な使用、外部サービスへの接続、ini設定の変更、エラーまたは例外の発行、グローバル変数または静的変数の変更、ファイルの読み取りまたは書き込みなどが含まれる
ini_set();
include "";
echo "";
など

function func() {}
は、declaration でありSide Effectsではない

上記を混ぜた状態でファイルを作成してはいけない
### 名前空間とクラス名
名前空間とクラスについては、「オートロード」PSRに従う必要がある → PSR-4
クラス名は、PascalCaseで宣言する必要がある (ExampleClassName など)
### クラス定数、プロパティ、メソッド
クラス定数はすべてアンダースコア区切りで大文字で宣言する必要がある (EXAMPLE_CLASS_CONST など)
プロパティは推奨されるべきものはないが、命名規則は一貫して適用されているべき
メソッド名は、camelCaseで宣言する必要がある (exampleMethodName など)
## PSR-12: Extended Coding Style
### 概要
PSR-1の拡張であるPSR-2の新しいバージョン
### ファイル
全てのPHPファイルは、Unix LF 行末のみを使用する必要がある
全てのPHPファイルは、単一のLFで終了する非空白行で終了する必要がある
PHPのみを含むファイルでは、終了タグを省略する必要がある
### 行の長さ
行の長さにハードリミットがあってはならない
行の長さのソフトリミットは120文字でなければならない
行は80文字以下である必要がある
行の末尾に空白があってはならない
読みやすくするため、または明示的に禁止されている場合を除き、関連するコードブロックを示すために、空白行を追加することができる
1行に複数のステートメントを含めてはいけない
### インデント
4スペースのインデントを使用する必要があり、インデントにタブを使用してはいけない
### ステートメント、ネームスペース、インポートステートメントの宣言
PHPファイルのヘッダーは、いくつかの異なるブロックで構成される場合がある
存在する場合、以下の各ブロックは単一の空白行で区切られなければならず、空白行を含んではいけない
関連しないブロックは省略できるが、各ブロックは以下にリストされている順序でなければならない

開始タグ (<?php)
ファイルレベルのdocblock
1つ以上の宣言ステートメント
ファイルの名前空間宣言
1つ以上のクラスベースのuseインポートステートメント
1つ以上の関数ベースのuseインポートステートメント
1つ以上の定数ベースのuseインポートステートメント
ファイル内の残りのコード

ファイルにHTMLとPHPが混在している場合でも、上記のセクションを適用する
PHPの終了タグが存在し、HTMLとPHPが混在している場合でも、ファイルの先頭にこれらのタグがなければならない

深さが2を超える複合名前空間は使用しない

PHPの開始タグと終了タグの外側にマークアップを含むファイルで厳密な型を宣言する場合、宣言はファイルの最初の行にあり、PHPの開始タグ、厳密な型宣言と終了タグを含める必要がある (つまり<html></html>の外側)

クラスは以下のような形にする

```php

Class ClassName
{
    // コード
}
```

開始中括弧は独自の行になければならず、空白行が前後にあってはならない
閉じ括弧は独自の行になければならず、空白行を前においてはならない
### プロパティと定数
すべてのプロパティで可視性を宣言する必要がある
すべての定数で可視性を宣言する必要がある
varキーワードは、プロパティを宣言するために使用してはいけない
ステートメントごとに複数のプロパティを宣言することはできない
保護された可視性またはプライベートな可視性を示すために、プロパティ名の前に単一のアンダースコアを付けてはいけない
つまり、アンダースコアプレフィックスは明示的に意味を持たない
型宣言とプロパティ名の間にはスペースが必要
### メソッドと関数
すべてのメソッドで可視性を宣言する必要がある
保護された可視性またはプライベートな可視性を示すために、メソッド名の前に単一のアンダースコアを付けてはいけない
つまり、アンダースコアプレフィックスは明示的に意味を持たない
メソッド名と関数名は、メソッド名の後にスペースを入れて宣言しない
開始ブレースは独自の行に移動する必要があり、終了ブレースは本文に続く次の行に移動する必要がある
開き括弧の後にスペースがあってはならず、閉じ括弧の前にスペースがあってはならない
### メソッドと関数の引数
引数リストでは、各コンマの前にスペースがあってはならず、各コンマの後にスペースが1つなければならない
デフォルト値を持つメソッドおよび関数の引数は、引数リストの最後に配置する必要がある
引数リストは複数の行に分割されてもいい
その場合、1段インデントされる
引数リストが複数の行に分割されている場合、閉じ括弧と開き中括弧は、それらの間に1つのスペースを入れて独自の行に一緒に配置する必要がある
以下のとおり

```php

public function exampleMethod(
    example1 $arg1,
    example1 $arg2,
    example1 $arg3
} {
    // コード
}
```

戻り値の型宣言が存在する場合、コロンの後に型宣言が続く1つのスペースが必要
コロンと宣言は、2つの文字の間にスペースを入れずに、引数リストの閉じ括弧と同じ行になければならない
以下のとおり

```php

public function exampleMethod(
    example1 $arg1,
    example1 $arg2,
    example1 $arg3
}: string {
    // コード
}
```

null許容型宣言では、疑問符と型の間にスペースがあってはならない
&引数の前に参照演算子を使用する場合、その後にスペースがあってはならない
可変長の3ドット演算子と引数名の間にスペースがあってはならない
参照演算子と可変長3ドット演算子の両方を組み合わせる場合、それらの2つの間にスペースがあってはならない
### abstract, final, そして static
存在する場合、abstractandとfinalは可視性宣言の前になければならない
存在する場合、staticは可視性宣言の後に来る必要がある
### メソッドおよび関数呼び出し
メソッドまたは関数呼び出しを行うとき、メソッドまたは関数名と開き括弧の間にスペースがあってはならず、開き括弧の後にスペースがあってはならず、閉じ括弧の前にスペースがあってはならない
引数リストでは、各コンマの前にスペースがあってはならず、各コンマの後にスペースが1つなければならない
引数リストは複数の行に分割されてもよい
その場合、1段階インデントされる
### 制御構造
制御構造キーワードの後に​​1つのスペースが必要
左括弧の後にスペースがあってはならない
閉じ括弧の前にスペースがあってはならない
閉じ括弧と開き括弧の間に1つのスペースが必要
構造体は一度インデントする必要がある
本体は、開きブレースの次の行になければならない
閉じ括弧は、本文の次の行になければならない
### if, elseif, else

```php

if ($expression1) {
    // コード
} elseif ($expression2) {
    // コード
} else {
    // コード
}
```

単一のキーワードに見えるように、else if の代わりにelseif を使用する必要がある
括弧内の式は、複数の行に分割できる (分割した場合は1段階インデントされる) 
分割したとき、最初の条件は次の行になければならない
閉じ括弧と開き括弧は、それらの間に1つのスペースを空けて、独自の行に一緒に配置する必要がある
条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければならない
### while、do while
以下のとおり

```php

while ($expression) {
    // コード
}
```

括弧内の式は、複数の行に分割できる
分割した場合、1段階インデントされる
分割した場合、最初の条件は次の行になければならない
閉じ括弧と開き括弧は、それらの間に1つのスペースを空けて、独自の行に一緒に配置する必要がある
条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければならない
do while も以下のとおり

```php

do {
    // コード
} while ($expression);
```

括弧内の式は、複数の行に分割できる
分割した場合、1段階インデントされる
分割した場合、最初の条件は次の行になければならない
条件間のブール演算子は、両方の組み合わせではなく、常に行の先頭または末尾になければならない
for文は以下のとおり

```php

for ($i = 0; $i < 10; $i++) {
   // コード
}
```

括弧内の式は、複数の行に分割できる
分割した場合、1段階インデントされる
分割した場合、最初の式は次の行になければならない
閉じ括弧と開き括弧は、それらの間に1つのスペースを空けて、独自の行に一緒に配置する必要がある
### foreach
foreach 文は以下のとおり
foreach ($iterable as $key => $value) {
    // コード
}
### try, catch, finally
try-catch-finally ブロックは以下のとおり

```php
try {
    // コード
} catch (FirstThrowableType $e) {
    // コード
} catch (OtherThrowableType | AnotherThrowableType $e) {
    // コード
} finally {
    // コード
}
```

### 演算子

インクリメント/デクリメント演算子は、演算子とオペランドの間にスペースがあってはならない
型キャスト演算子は、括弧内にスペースを入れてはならない
すべての2進算術演算子、比較演算子、割り当て演算子、ビット単位演算子、 論理演算子、文字列演算子、および型演算子の前後には、少なくとも1つのスペースが必要
三項演算子の前後には ? と : の両方を囲む少なくとも1つのスペースが必要
条件演算子の中央のオペランドが省略されている場合以下のとおり

```php
$variable = $foo ?: 'bar';
```

## そのほか
AUTOLOADING
PSR-4: Improved Autoloading

INTERFACES
PSR-3: Logger Interface
PSR-6: Caching Interface
PSR-11: Container Interface
PSR-13: Hypermedia Links
PSR-14: Event Dispatcher
PSR-16: Simple Cache

HTTP
PSR-7: HTTP Message Interfaces
PSR-15: HTTP Handlers
PSR-17: HTTP Factories
PSR-18: HTTP Client

## 場所とか
https://www.php-fig.org/
https://www.php-fig.org/psr/
https://www.php-fig.org/faqs/