PHPMDでコードの混乱を探知！

PHP AdventCalendar 16日目を担当する@syossan27です！

今回はコードのアレコレを探知してくれるPHPMDの記事をお送りします。


# PHPMDって？

PHPMDは正式名称をPHP Mess Detectorと言い、直訳すると__PHP混乱探知機__というそのまんまな名前です。
本当に読んで字のごとくなんですが、PHPの混乱している部分を探知してくれます！

PHPMDには次の４つを静的解析する機能があります。

- __潜在バグ__
- __次善コード__
- __複雑過ぎる問題__
- __未使用のパラメータ、メソッド、プロパティ__

特に嬉しいのは潜在バグを発見してくれる機能ですね！
どこまでの精度があるのかは謎ですが・・・

# インストール

それではインストールしていきます！

やり方はちょー簡単。
composerでチョチョイのチョイです！

```composer.json
"require-dev": {
    "phpmd/phpmd" : "*" 
}   
```

あとは__composer install__を動かすだけで/vendorにphpmdが入ります。

# 試してみる

それではPHPMDを動かしてみましょう！
テスト用に以下のファイル作ってみました。

```test.php
<?php

    class main {
        function _construct() {
            ech "hoge";
            $hoge = "hoge";
        }   
    } 
```

このファイルを分析するために以下のコマンドを実行します。

```
$ ./vendor/phpmd/phpmd/src/bin/phpmd test.php text codesize,controversial,design,naming,unusedcode
```

そうすると以下の様な結果が出ました。

```
/Users/bps/test/test.php:3	The class main is not named in CamelCase.
/Users/bps/test/test.php:4	The method _construct is not named in camelCase.
/Users/bps/test/test.php:6	Avoid unused local variables such as '$hoge'.
```

_constructのとことかechのとことか怒られるかと思ったら意外と怒られなかった・・・
命名や、使われていない変数のところが怒られてますねー。

# 説明

phpmdのコマンドですが、以下の様なルールがあります。

```
Mandatory arguments:
1) A php source code filename or directory. Can be a comma-separated string
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Available formats: xml, text, html.
Available rulesets: cleancode, codesize, controversial, design, naming, unusedcode.

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold; rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--suffixes: comma-separated string of valid source code filename extensions
--exclude: comma-separated string of patterns that are used to ignore directories
--strict: also report those nodes with a @SuppressWarnings annotation
```

ザッと翻訳してみるとこんな感じ。

```
必須の引数：
1) PHPファイルの名前 or ディレクトリ名を指定して下さい。コンマ区切りの文字列も指定できます。
2) 結果の出力形式を指定して下さい。
3) 分析ルールファイルか分析ルール名をカンマ区切りで指定して下さい。

利用可能な出力形式：xml, text, html
利用可能な分析ルール：cleancode（綺麗なコードかチェック）,
                    codesize（コードが大きすぎないかチェック）, 
                    controversial（命名規則など論争が巻き起こりそうなものチェック）,     
                    design（設計上の問題チェック）, 
                    naming（変数名など名前関連のチェック）, 
                    unusedcode（未使用のコードのチェック）

* 分析ルールは大きく分けてこれだけですが、それぞれ細かい分析粒度あるので気になる方は http://phpmd.org/rules/index.html をチェック！

オプション引数：
--minimumpriority：分析ルールレベル。
* 分析ルールにはそれぞれレベルがあります。詳しくは先ほどのリンクから各分析ルールの詳細を見て下さい。

--reportfile：出力結果をファイルに書き出します。デフォルトは標準出力です。

--suffixes：分析対象とする拡張子を指定する。拡張子名をカンマ区切りで指定します。
* 分析対象をディレクトリで指定した場合に使う感じですね。

--exclude：分析対象にしないディレクトリ名を指定する。
* こちらも分析対象をディレクトリで指定した場合に使います。

--strict：@SuppressWarnings注釈をもつノードをレポートします。
* 警告抑止に使われるSuppressWarningsがあればレポートするかどうかを指定します。
```

補足が必要なところは*で書いときました。

このように結構自由度を持って分析基準を定めることが出来ます。
また、自分で分析ルールを作ることも出来るので自由度は殊更ですね！

# まとめ

精度はさておきひとまずPHPのコードをチェックしたいって時に凄く使えそうですね！
インストールもcomposerでチョチョイのチョイですし。

海外の評判を見てると__jenkinsとかCIツールに組み込んで使ってるぜ！__って人が結構多そうなので、気になる方は調べてみるといいかも。

それでは皆様良いPHPライフを！


# 参考URL

・本家
http://phpmd.org/

・PHPの静的コード解析ツール『PHPMD』を使ってみた。
http://qiita.com/yuji0602/items/28b0c2363bae8fce055a