PSR-2 コーディングガイドを自分用にざっくり解説してみる

# 目的

- PSR-2 コーディングガイドの内容が堅苦しくてぱっと理解できなかったため自分用に解説してみる

# PSR-2の「概要」に記載されている内容

- インデントには４つのスペースを使用し、タブは使用してはいけません。
- 行の長さに対してハードリミットがあってはいけません。ソフトリミットは１２０文字を上限とし、実際は８０文字以内に抑えるべきです。
- 名前空間定義のあとには空行を挟まなければいけません。またuse定義ブロックのあとにも同様に空行を挟まなければなりません。
- クラスの開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。
- メソッドの開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。
- アクセス修飾子は、全てのプロパティ、メソッドに定義しなければなりません。またabstractとfinalはアクセス修飾子の前に定義し、staticはアクセス修飾子の後に定義しなければなりません。
- 制御構造の開始時は、その後に１スペースを開けなければなりません。メソッドや関数の呼び出しはスペースを開けてはいけません。
- 制御構造の開き括弧は同じ行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。

# 概要に記載されている内容の解説

### インデントには４つのスペースを使用し、タブは使用してはいけません。

- これは記載されている内容そのままでもわかる。
- tabを使ったインデントはNG、半角スペース×4でインデントを作る。

### 行の長さに対してハードリミットがあってはいけません。ソフトリミットは１２０文字を上限とし、実際は８０文字以内に抑えるべきです。

- 多分1ステップに記載する文字数制限の事
- ハードリミットとは「1ステップはこの文字数でないといけない」という成約
- 少なからず1ステップは120文字以下にすれば問題ない。努力目標として80文字以下にしよう。

### 名前空間定義のあとには空行を挟まなければいけません。またuse定義ブロックのあとにも同様に空行を挟まなければなりません。

- `namespace`や`use`のあとに一行空の行を入れないといけない。

### クラスの開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。

- これも記載されている内容そのままで、クラスの括弧は次の行に記載する。
- 下記はNG

    ```php
    class Sample{
        public function sampleFunction()
        {
            //メソッドの内部処理
        }
    }
    ```

- 下記はOK

    ```php
    class Sample
    {
        public function sampleFunction()
        {
            //メソッドの内部処理
        }
    }
    ```

### メソッドの開き括弧は次の行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。

- これも記載されている内容そのまま&クラスの記載方法と同じ。
- 下記はNG

    ```php
    class Sample
    {
        public function sampleFunctionA(){//メソッドの内部処理 }

        public function sampleFunctionB(){
            //メソッドの内部処理 }
    }
    ```

- 下記はOK

    ```php
    class Sample
    {
        public function sampleFunctionA()
        {
            //メソッドの内部処理
        }

        public function sampleFunctionB()
        {
            //メソッドの内部処理
        }
    }
    ```

### アクセス修飾子は、全てのプロパティ、メソッドに定義しなければなりません。またabstractとfinalはアクセス修飾子の前に定義し、staticはアクセス修飾子の後に定義しなければなりません。

- アクセス修飾子はメソッドや変数定義の際に書く「public」や「private」や「protected」とかのやつ。
- メソッドやメソッドを定義する時に「public」や「private」や「protected」は必ず記載しないといけない。
- 抽象クラスの定義時に使用する「abstract」や小クラスから上書きされないメソッドを定義するときに使用する「final」は「public」や「private」や「protected」の前に定義しないといけない。

### 制御構造の開始時は、その後に１スペースを開けなければなりません。メソッドや関数の呼び出しはスペースを開けてはいけません。

- 制御構造キーワード（ifなど）の後ろは1スペースを開ける必要がある。
- メソッドや関数の呼び出しのときにメソッド・関数名の直後にスペースを開けてはいけない。
- 下記はNG

    ```php
    class Sample
    {
        public function sampleFunctionA()
        {
            $this->foo ($strA,$strB);
        }

        public function sampleFunctionB()
        {
            if(true) {
                echo 'OK'
            }
        }
    }
    ```

- 下記はOK

    ```php
    class Sample
    {
        public function sampleFunctionA()
        {
            $this->foo($strA, $strB);
        }

        public function sampleFunctionB()
        {
            if (true) {
                echo 'OK'
            }
        }
    }
    ```

### 制御構造の開き括弧は同じ行に記述しなければなりません。また閉じ括弧は本文最後の次の行に記述しなければなりません。

- 下記はNG

    ```php
    class Sample
    {
        public function sampleFunctionA()
        {
            $this->foo();
        }

        public function sampleFunctionB()
        {
            if (true) 
            {
                echo 'OK'}
        }
    }
    ```

- 下記はOK

    ```php
    class Sample
    {
        public function sampleFunctionA()
        {
            $this->foo();
        }

        public function sampleFunctionB()
        {
            if (true) {
                echo 'OK'
            }
        }
    }
    ```


# 参考文献

- [http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html)
- [https://www.php.net/manual/ja/language.oop5.final.php](https://www.php.net/manual/ja/language.oop5.final.php)
- [https://www.ritolab.com/entry/92](https://www.ritolab.com/entry/92)