Posted at
PHPDay 16

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

More than 3 years have passed since last update.

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