PHPの静的コード解析ツールPHPMDの使い方

## まずは本家ドキュメント

### ルールの内容
https://phpmd.org/rules/index.html

### ルールセットの作り方
https://phpmd.org/documentation/creating-a-ruleset.html

英語だけど翻訳機能を使えば割りと良い感じで読める。

## 大枠の構成と方針

* ルールセットがあって、それらに単品のチェックルールが入っている構成
* ルールセットも、xmlで定義されている
* ルールのパラメータ上書きもできる（メソッド名は最低3文字など）
* ルールセットの複数指定もできる

今回は、ルールセットを指定して、セットの中の都合の悪いものだけ、無効化する方針とした。

## install
```bash
composer require --dev "phpmd/phpmd=@stable"
```

## help見る
```bash
./vendor/bin/phpmd --help
```
使えるrulesetとか、出力フォーマットの種類とか、cacheオプションなど色々書いてある

## 単品ファイルなど、手動でフルチェックしたい場合（controversialは議論のあるルールセットなので外すのも良いかと）
```bash
./vendor/bin/phpmd hoge.php text cleancode,codesize,controversial,design,naming,unusedcode
```

## ファイル数が多く実行時間が長い場合、キャッシュしよう
```bash
./vendor/bin/phpmd --cache hoge.php text unusedcode
```
キャッシュファイルが出来上がるので、git使っている場合はignoreに入れておくと良い。

また、デフォルトでは、ファイルのhash値をキャッシュに保存しておき、変更を検知する仕組みとなる。
（更新日付で管理することも可能らしいが、問題なければデフォルトで良さそう）

## 標準出力も受け取れるので、生成コードのチェックなども出来る
```bash
cat hoge.php | ./vendor/bin/phpmd - text unusedcode
```

## gitの差分ファイルをphpmdでチェックする場合
```bash
git diff --name-only | fgrep '.php' | xargs -I {} ./vendor/bin/phpmd {} text unusedcode
```

## 自作のconfigファイルを使う場合
```bash
./vendor/bin/phpmd tests text phpmd_config.xml
```

## 自作xmlサンプル（途中からプロジェクトに入れる流れの中で作成した）
```xml
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>

    <!-- @see https://phpmd.org/documentation/creating-a-ruleset.html -->
    <!-- @see https://phpmd.org/rules/index.html -->

    <rule ref="rulesets/cleancode.xml">
        <exclude name="StaticAccess" />
        <exclude name="ElseExpression" />
        <exclude name="BooleanArgumentFlag" />
    </rule>
    
    <rule ref="rulesets/codesize.xml">
        <exclude name="ExcessiveClassLength" />
        <exclude name="ExcessiveMethodLength" />
        <exclude name="ExcessivePublicCount" />
        <exclude name="TooManyFields" />
        <exclude name="TooManyMethods" />
        <exclude name="TooManyPublicMethods" />
    </rule>
    
    <rule ref="rulesets/design.xml">
        <exclude name="NumberOfChildren" />
        <exclude name="CouplingBetweenObjects" />
    </rule>
    
    <rule ref="rulesets/naming.xml">
        <exclude name="LongVariable" />
        <exclude name="LongClassName" />
        <exclude name="ShortMethodName" />
        <exclude name="ShortVariable" />
        <exclude name="BooleanGetMethodName" />
    </rule>

    <rule ref="rulesets/unusedcode.xml" />

</ruleset>
```


## vscodeにも入れよう
PHP Mess Detector プラグインを使用した。
使えそうなプラグインが２個あったが、上記で動いたため、もう片方は検証してない。

設定は、下記２項目を設定するだけで動いた。

```
Phpmd: Command
~/path/to/vendor/bin/phpmd

Phpmd: Rules
~/path/to/phpmd_config.xml
```

ドキュメントには、 `${workspaceFolder}` が使えると書いてあった。

だが、自分のワークスペースの使い方が独特なのが原因か？、機能しなかったので、フルパスを設定した。

## 最後に

目視では抜けるものがあったりするので、linterとformatterと自動テストは、最初から入れておきたいと改めて思った。

また、変数名やメソッドのサイズなど細かいルールがあるが、あまり細かくやっても制約になるので、ほどほどの設定が良いと思う。
（コードが読みやすいことと、おかしな点を見つけられることが大事。）