LoginSignup
42
42

More than 5 years have passed since last update.

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

Posted at

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

42
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
42