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


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

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

PHPMDって?

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

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

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

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

インストール

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

やり方はちょー簡単。
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