PHP言語はアプリケーション開発の現場で非常に多く使われている、最もポピュラーな言語の一つです。20年近い歴史のあるプログラミング言語であり、その歴史の中で様々なライブラリやフレームワークが開発されてきました。
ライブラリやフレームワークは様々な文化で作られており、変数名やメソッド名の命名規則だけとっても、CamelCaseとlower-caseのどちらもポピュラーな存在です。
例えば、CodeIgniterのStyleGuideではCamelCaseと指定されていますし、FuelPHPのCoding Standardsではlower caseが指定されています。
様々なコードの書き方のバックグラウンドを持つメンバーで1つのプロジェクトを進める場合、コーディングスタンダードを予め定めておくことで、可読性・検索性の高いコードをより保ちやすくなります。
コーディングスタンダードに沿っているかどうかをコードレビューの際に目視で確認するのはとても面倒です。それに代わって、ソースコード解析ツールを使ってチェックすることが出来ます。
PHPには幾つかのソースコード解析ツールがありますが、今回はその一つPHP_CodeSnifferを紹介します。なおSideCIではPHP_CodeSnifferを使ってPHPプロジェクトを解析できます。
PHP_CodeSnifferのインストール
PHP_CodeSnifferはいくつかの方法でインストールできます。Composerを使った場合は次のようにコマンドを打ちます。
$ composer global require "squizlabs/php_codesniffer=*"
このようにインストールすると ~/.composer/vendor/bin/
以下にインストールされますので、パスを通しておくと良いでしょう。
2つ目としてPearを使った方法があります。
$ pear install PHP_CodeSniffer
このようにインストールすると ~/pear/bin/
以下にインストールされます。
最後にファイルを直接ダウンロードする方法があります。
$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar php phpcs.phar -h $ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar php phpcbf.phar -h
実行する際には php phpcs.phar
や php phpcbf.phar
のようにします。
使い方
基本的には引数としてチェックしたいPHPプロジェクトがあるディレクトリを指定します。コマンドは phpcs
です。例えば以下が実行例になります。
$ phpcs . FILE: /path/to/your/code.php -------------------------------------------------------------------------------------------------- FOUND 61 ERRORS AFFECTING 38 LINES -------------------------------------------------------------------------------------------------- 2 | ERROR | [ ] Missing file doc comment 7 | ERROR | [ ] Missing @category tag in class comment : 34 | ERROR | [x] Tag value indented incorrectly; expected 2 spaces but found 1 35 | ERROR | [ ] Tag cannot be grouped with parameter tags in a doc comment
PHP_CodeSniffer が検出した問題について、そのファイルと行数が一覧になります。さらに問題が検出された実際のコードを確認する場合はオプションに --report=code
と指定します。そうすると次のように問題のある箇所をコードで示してくれるようになります。
$ ~/.composer/vendor/bin/phpcs --report=code . | more FILE: /path/to/your/code.php --------------------------------------------------------------------------------------------------- FOUND 61 ERRORS AFFECTING 38 LINES --------------------------------------------------------------------------------------------------- LINE 2: ERROR [ ] Missing file doc comment --------------------------------------------------------------------------------------------------- 1: <?php >> 2: 3: namespace·Ncmb; 4: --------------------------------------------------------------------------------------------------- LINE 7: ERROR [ ] Missing @category tag in class comment LINE 7: ERROR [ ] Missing @package tag in class comment LINE 7: ERROR [ ] Missing @author tag in class comment LINE 7: ERROR [ ] Missing @license tag in class comment LINE 7: ERROR [ ] Missing @link tag in class comment --------------------------------------------------------------------------------------------------- 5: /** 6: ·*·Acl·class >> 7: ·*/ 8: class·Acl·implements·Encodable 9: { --------------------------------------------------------------------------------------------------- LINE 10: ERROR [x] The open comment tag must be the only content on the line LINE 10: ERROR [ ] Missing short description in doc comment LINE 10: ERROR [x] The close comment tag must be the only content on the line :
PHPCBFで一気に綺麗に
一つ一つ手作業で直しても良いのですが、より簡単に直してくれるのが phpcbf コマンドになります。これを実行すると、直すべき点をまとめて変換してくれます。
$ phpcbf . PHPCBF RESULT SUMMARY --------------------------------------------------------------------------------------------------- FILE FIXED REMAINING --------------------------------------------------------------------------------------------------- /path/to/your/code.php 23 38
例えばクラスの説明の書き方を直してくれます。
- /** @var public ACL */ + /** + * @var public ACL + */
引数の渡し方も一行の文字数に基づいて直してくれます。
- if (strncmp($headers['Content-Type'][0], $validContent, - strlen($validContent)) !== 0) { + if (strncmp( + $headers['Content-Type'][0], $validContent, + strlen($validContent) + ) !== 0 + ) {
ただし残念ながら、PHP_CodeSniffer で検出された全ての問題が自動で修正されるわけではありません。例えばドキュメント用の @author
といったタグは自動入力してくれません。そのためエラーは残り続けることになるでしょう。とは言え、ある程度自動で修正してくれれば、すべて手で直すのに比べると大幅に時間の節約になります。なお、自動修正に頼り切ってしまうと、どう書くのが良いのかを学ぶ機会が失われてしまいます。そのため、PHPCBF 実行前後の差分を確認して、次回以降どう書けば良いのかを学ぶのがお勧めです。
PHP_CodeSnifferではデフォルトでPEARのコーディングスタンダードが適用されます。しかしその他にもPSR2、Zend、Generic、Squizから選択できます。スタンダードを追加することも出来、cakephp-codesnifferなど、フレームワークごとに公開されている事があります。自社内で用いているコーディングスタンダードに合わせて選択してください。
SideCIではPHP_CodeSnifferを用いたPHPプロジェクトのコードレビュー自動化に対応しています。ESLintを個々人のPCで使うのも便利ですが、SideCIを利用してGitHub PullRequesetと連携した自動レビューとして、プロジェクトメンバー全員で共通して使う運用がとても便利です。PHP_CodeSnifferをGitHubへのプッシュに連携して自動レビューするようにしたり、複数人での開発時にはSideCIなどのクラウドサービスを利用した運用が便利です。ぜひ活用してください。