PHP
phpmd

[PHP] 静的解析ツールPHPMDの機能概要

初めに

今回はPHPの静的解析ツールの定番PHPMDについてまとめた記事を書きました。この記事はPHPMDの機能概要をざっと理解するためのものです。
また、PHPMDの機能を再確認するときのメモとして使いたかったので、公式ドキュメントへのリンクをやや多めにしています。
PHPMDのことを知っている人にとってはスキップできる内容だと思います。

ちなみに本記事はPHPMD v2.6.0に関する記事です。

そもそも静的解析とは?

静的解析とは大雑把に言うとファイルは実行せずにその内容の解析を行うこと。
実際にファイルを実行する訳ではないので、

  • フローが正しいかどうか
  • バグ
  • メモリエラー

などは解析しない。静的解析では何をするかというと、

  • スタイルガイドに即していない箇所
  • 未使用の変数や関数
  • 肥大しているclassやmethod
  • 再検討すべきネーミング

などを検出してくれる。
これらのツールをプロジェクトへ導入するメリットとしては、

  • 機械的にコーディングスタイルを順守するための仕組みができる。
  • 良いコーディング習慣を経験の浅いエンジニアにも体感させることができる。
  • エンジニアがコードを読みやすくしようと意識するようになる。
  • ツールでのチェックを通過したものがコードレビューに回ってくるので、レビューがより効果的なものになりやすい。

などが考えら、コードの可読性、保守性の向上が期待できるます。

PHPMDとは?

PHPで書かれたコードを静的解析してくれるツール。
1st releaseは2009年12月で最新versionは2017年1月にリリースされています。
長期間サポートされ続けているが最近はcommit頻度が落ちているようです。
この状況をツールとして成熟しきったととらえるか、ツールとしての役割の終えたととらえるかは難しいところ。

インストール方法

PHPなのでcomposerを使ってインストールするのがスタンダードなやり方だと思います。

composer.json
{
    "require-dev": {
        "phpmd/phpmd" : "@stable"
    }
}
$ php composer.phar install

参照ページ Installing via Composer

実行コマンドに関して

helpを見た方が読みやすかったので、helpを載せておきます。

$ vendor/phpmd/phpmd/src/bin/phpmd --help
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, e.g. php,phtml
--exclude: comma-separated string of patterns that are used to ignore directories
--strict: also report those nodes with a @SuppressWarnings annotation
--ignore-violations-on-exit: will exit with a zero code, even if any violations are found

必須の引数

説明 備考
解析対象のファイル or ディレクトリのパス commaで複数指定可能
report format  xml, text, htmlが指定可能
rules cleancode, codesize, controversial, design, naming, unusedcodeが指定可能。またカスタムルールも指定可能。
command_example
$ phpmd /path/to/source text codesize,unusedcode,naming,/my/rules.xml

任意の引数 (必須引数の後に置く)

説明 備考
--minimumpriority ルールのプライオリティの閾値設定。
--reportfile ファイルにレポートを出力する。
--suffixes 有効にしたいファイルの拡張子を指定する。commaで複数指定可能。
--exclude 除外したいディレクトリを指定する。commaで複数指定可能。
--strict @SuppressWarningsアノテーションを持つノードも報告
--ignore-violations-on-exit 違反が見つかった場合でもreturn codeは0を返す。
command_example
$ phpmd /path/to/source xml codesize --reportfile phpmd.xml --suffixes php,phtml
PHPMDのruleの詳細

phpmdのルール一覧にはサンプルコード付きの説明が日本語で書かれていますのでそちらの記事の方が参考になるかと思います。

カスタムルールクラスを使用してPHPMDを拡張する方法

リンクだけ紹介しておきます。興味のある方はどうぞ。
How to write a Rule for PHPMD