複雑であったりトリッキーなコードは思わぬバグを生む可能性があります。また、未使用の変数やメソッドなども本当は使われるはずが、タイポしていて使われていない可能性もあります。そうしたコードの問題点を指摘してくれるソフトウェアが多数存在します。
今回は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つの引数があります。
- ソースコードまたはディレクトリを指定します。カンマで複数指定もできます。
- レポートのフォーマット。xml、text、htmlが指定できます。
- ルールセット。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
使われていないコードを見つけて指摘します。
これらのルールを指定(複数可)して、コードをチェックしてくれます。
SiderではPHPMDを用いたPHPプロジェクトのコードレビューに対応しています。PHPMDをGitHubへのプッシュに連携して自動レビューするようにしたり、複数人での開発時にはクラウドサービスを利用した運用が便利です。ぜひ活用してください。
また、PHPMDはプロジェクト全体に対して実行するとツールの性質上、解析に時間がかかりがちです。コードレビューに特化したサービスであるSideCIでは、PHPMDをレビュー対象に限定して解析を行うなどの配慮をしており、実用的な時間でPHPMDの解析結果を受取ることができます。JenkinsやSonarQube、その他のCIサービスなどでPHPMDをすでにご利用の方も、一度SideCIをお試し頂ければ幸いです。