SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



PHPMDを使ってPHPのコードを綺麗にしよう

複雑であったりトリッキーなコードは思わぬバグを生む可能性があります。また、未使用の変数やメソッドなども本当は使われるはずが、タイポしていて使われていない可能性もあります。そうしたコードの問題点を指摘してくれるソフトウェアが多数存在します。

今回はPHPプロジェクトで使えるPHPMDを紹介します。JavaのPMDに類似した、PMDのPHP版のようなソフトウェアです。バグになりそうな部分、最適ではないコード、複雑な表現、未使用のパラメータやメソッド、プロパティを指摘してくれます。

PHPMDのインストール

PHPMDはいくつかの方法でインストールできます。Composerを使った場合は、まず次のようにコマンドを打ちます。

composer global require "phpmd/phpmd=@stable"

このようにインストールすると ~/.composer/vendor/bin/ 以下にインストールされますので、パスを通しておくと良いでしょう。

2つ目の方法として、プロジェクト内のみにインストールする場合は次のようにComposerのコマンドを打ちます。

composer require "squizlabs/php_codesniffer=*"

こちらの方法では ./vendor/bin/ 以下にインストールされます。

3つ目としてファイルを直接ダウンロードする方法があります。

wget -c http://static.phpmd.org/php/latest/phpmd.phar
php phpmd.phar --help

実行する際には php phpmd.phar のようにします。

使い方

まずはオプションを紹介します。

$ ~/.composer/vendor/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

全部で3つの引数があります。

  1. ソースコードまたはディレクトリを指定します。カンマで複数指定もできます。
  2. レポートのフォーマット。xml、text、htmlが指定できます。
  3. ルールセット。cleancode、codesize、controversial、design、naming、unusedcodeが選択できます。

ファイル数にもよりますが、実行完了までしばらく待たされることがあります。テキストを指定した場合、次のような結果が返ってきます。

/path/to/your/project/Acl.php:101    The method setAccess uses an else expression. Else is never necessary and you can simplify the code to work without else.
/path/to/your/project/ApiClient.php:47  Avoid using static access to class 'Ncmb\NCMB' in method 'create'.
/path/to/your/project/ApiClient.php:121 Avoid using static access to class 'Ncmb\User' in method 'request'.

他にもHTMLを指定した場合は次のような結果になります。この場合は reportfile オプションを使ってファイルとして保存すると便利です。

ルールセットについて

PHPMDで指定できるルールセットは次の通りです。

  • クリーンコードルール:cleancode
    汚いコードについて指摘が入ります。
  • コードサイズルール:codesize
    メソッドが多すぎたり、クラスが大きい場合に分割してコードサイズを減らそうとします。
  • 議論ルール:controversial
    PHPで開発する中で度々問題視されるキャメルケースとスネークケースについてキャメルケースを使うように指摘します。
  • デザインルール:design ソフトウェアデザインに関連した問題を指摘します。
  • 命名ルール:naming
    長い名前、逆に短い名前などを指摘します。
  • 未使用コードルール:unusedcode 使われていないコードを見つけて指摘します。

これらのルールを指定(複数可)して、コードをチェックしてくれます。


SideCIではPHPMDを用いたPHPプロジェクトのコードレビューに対応しています。PHPMDをGitHubへのプッシュに連携して自動レビューするようにしたり、複数人での開発時にはクラウドサービスを利用した運用が便利です。ぜひ活用してください。 また、PHPMDはプロジェクト全体に対して実行するとツールの性質上、解析に時間がかかりがちです。コードレビューに特化したサービスであるSideCIでは、PHPMDをレビュー対象に限定して解析を行うなどの配慮をしており、実用的な時間でPHPMDの解析結果を受取ることができます。JenkinsやSonarQube、その他のCIサービスなどでPHPMDをすでにご利用の方も、一度SideCIをお試し頂ければ幸いです。

PHPMD - PHP Mess Detector

SideCI logo