PHP_CodeSniffer phpcs のインストールと使用方法

<h2>PHP_CodeSnifferとは</h2>

コーディング規則にそってコードが記述されているか静的解析するツールの事である。ここで基準にしているコーディング規則とは、[PSR-1](https://www.php-fig.org/psr/psr-1/)と[PSR-12](https://www.php-fig.org/psr/psr-12/)である。



※<b>静的解析</b>とは、コードを実行せずに、コードの問題点をチェックすること。

PHP_CodeSnifferには、主に2つの機能がある。

<ul>
<li><b>phpcs</b></li>
コーディング規約を守れていないコードの検出

<li><b>phpcbf</b></li>
コーディング規約に従ってコードを自動修正
</ul>

この記事では、phpcsをメインに解説する。

<h2>インストール方法</h2>

composerを使用する。

composer.jsonに下記を入力する。

```json
"require-dev": {
        "squizlabs/php_codesniffer": "3.*"
    }
```

`require-dev`とは、開発環境のみに必要で、本番環境には必要ないライブラリの設定である。

```json
{
    "name": "root/html",
    "require": {},
    "require-dev": {
        "squizlabs/php_codesniffer": "3.*",
    }
}
```
こんな感じになってればOK

そして、ターミナルで`composer install` or `composer update`を入力する。

vendor/bin 直下に phpcsとphpcbfが作成されていることが確認できればインストールは完了である。

<h2>1.使用方法 コマンド</h2>

ディレクトリ、ファイルを指定して下記を実行する。

```
./vendor/bin/phpcs --standard=PSR12 /path/to/code-directory
```

`./vendor/bin/phpcs`→ vendor/bin直下のphpcsファイル

`--standard=PSR12`→ PSR-12のルールを指定する。

<h3>具体例</h3>

sample.phpと題して、わざとコーディング規約に反したコードを用意してみる。

```php
const price = 100;
if ($v === 1) echo 'Hello';
```

これを、phpcsで静的解析すると…

```
FILE: /var/www/html/sample.php
--------------------------------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
--------------------------------------------------------------------------------------------------------------------------------------
 3 | ERROR | [ ] Class constants must be uppercase; expected PRICE but found price
   |       |     (Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase)
 4 | ERROR | [x] Inline control structures are not allowed (Generic.ControlStructures.InlineControlStructure.NotAllowed)
--------------------------------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------------------------------------------------------------

```

2つのエラーが表示される。

<ul>
<li>定数名は大文字にしてください（Class constants must be uppercase; expected PRICE but found price）</li>
<li>if文は決められた構造で記述してください。（Inline control structures are not allowed）</li>
</ul>

<h2>2.使用方法 設定の自動化 XMLファイルに記述</h2>

毎回、毎回コマンドで設定を打ち込むのが面倒なので、ファイルに設定を記載して自動化しておく。

phpcs.xmlファイルを記載して下記を記述する。

※詳しくは、[PHP_CodeSniffer Annotated Ruleset](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-Ruleset)

```xml
<?xml version="1.0"?>
<ruleset name="Custom PSR12" namespace="MyProject\CS\Standard">
    <!-- <description>は、このルールの設定の説明する -->
    <description>A custom coding PSR12</description>
    <!-- <file>は、解析する場所のディレクトリを記載する。 -->
    <file>./</file>
    <!-- <exclude-pattern>は、解析から除外するファイルを記載する。 -->
    <exclude-pattern type="relative">./vendor/*</exclude-pattern>
    <!-- <arg>は、解析の際に使用するオプション -->
    <arg name="colors"/>
    <arg value="s"/>
    <!-- <rule>は、適応するルールを記載する。 -->
    <rule ref="PSR12"/>
</ruleset>
```

上記の記載が終了したら、ターミナルで下記のように実行する。

```
./vendor/bin/phpcs --standard=phpcs /path/to/code-director
```

1.使用方法 コマンド と同じ結果が返ってくればOK

※ディレクトリ、ファイル部分は設定で記載していれば記述する必要はなし

<h2>参考</h2>

[独学エンジニア](https://dokugaku-engineer.com/course/serverside)
[PHP_CodeSniffer公式ドキュメント](https://github.com/squizlabs/PHP_CodeSniffer)