PHP AdventCalendar 16日目を担当する@syossan27です!
今回はコードのアレコレを探知してくれるPHPMDの記事をお送りします。
PHPMDって?
PHPMDは正式名称をPHP Mess Detectorと言い、直訳すると__PHP混乱探知機__というそのまんまな名前です。
本当に読んで字のごとくなんですが、PHPの混乱している部分を探知してくれます!
PHPMDには次の4つを静的解析する機能があります。
- 潜在バグ
- 次善コード
- 複雑過ぎる問題
- 未使用のパラメータ、メソッド、プロパティ
特に嬉しいのは潜在バグを発見してくれる機能ですね!
どこまでの精度があるのかは謎ですが・・・
インストール
それではインストールしていきます!
やり方はちょー簡単。
composerでチョチョイのチョイです!
"require-dev": {
"phpmd/phpmd" : "*"
}
あとは__composer install__を動かすだけで/vendorにphpmdが入ります。
試してみる
それではPHPMDを動かしてみましょう!
テスト用に以下のファイル作ってみました。
<?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
・PHPの静的コード解析ツール『PHPMD』を使ってみた。
http://qiita.com/yuji0602/items/28b0c2363bae8fce055a