この記事はCakePHP Advent Calendar 2011に参加しています。

記述したコードの表記ゆれを防ぐ為の手法としてコーディング規約があります。見通しが良く一貫性のあるスタイルで記述されたコードはメンテナンス性を維持する助けになり、コードレビューの際の不毛な論争を少し減らす手助けになります。今回はCakePHPでアプリケーションを開発する際にコーディング規約を適用する方法を検討してみます。

どのコーディング規約を適用するか

PHPではPEARのコーディング規約が一般的に知られていますが、PEARはライブラリという事もありこの規約をそのままアプリケーションの実装に適用するのは冗長かもしれません。また同様にZendフレームワークやSymfonyもコーディング規約を持っています。
CakePHPでアプリケーションを実装する場合を考えてみても、PEARのスタイルはCakePHPが採用しているスタイルを使うよりはフレームワークに合わせてCakePHPのスタイルを採用するのはそれなりに妥当なのではないでしょうか。

CakePHPのコーディング規約

CakePHPのコーディング規約については公式のドキュメント内に記述があります。

CakePHP1.3のドキュメント
http://book.cakephp.org/view/509/Coding-Standards
CakePHP2.0のドキュメント
http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html

二つのドキュメントは体裁が異なっていますが内容は現時点で同一です。CakePHPのコーディング規約が定めている内容を下記の通りです。

  • タブによるインデント
  • 制御構文(if for foreach while switch)の記述
  • 参考演算子
  • 関数呼び出し
  • メソッド定義
  • コメント
  • ファイルのインクルード
  • PHPタグ
  • 命名規約(関数 クラス メソッド 変数)
  • アクセス修飾子
  • メソッドチェーン
  • サンプルのアドレス
  • ファイル名
  • 変数の型
  • 定数

PHP_CodeSnifferの導入

コードが規約に沿って記述されているかをチェックするツールとしてはPHP_CodeSnifferが知られています。PEARで配布されているライブラリなのでインストールはPEARコマンドを使う事になります。標準のチャンネルからインストールできるパッケージなので1つのコマンドだけでインストールできます。

pear install PHP_CodeSniffer

インストールが完了すれば下記のコマンドでPHP_CodeSnifferが起動します。またインストール済みのコーディング規約のリストを確認もできます。

$ phpcs --version
PHP_CodeSniffer version 1.3.1 (stable) by Squiz Pty Ltd. (http://www.squiz.net)
$ phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, Squiz and Zend

ご覧の通りPEARの規約などはインストールされていますが、CakePHP用の規約はインストールされていません。CakePHP用の規約は無いのかなとツイートしてみたところCakeのコアな開発者であるsavantさんがgithub上にでjrbassoさんが開発しているものを教えてくれました。他にもAD7sixさんがメンテナンスしているものもあるのですが、今回は最初のものを使ってみます。phpcsコマンドは任意のディレクトリに存在する規約を読み込む事もできますが、簡単に使うにはPEARのインストールディレクトリ配下の下記のパスにgithubから落としてきたコードを配置します。

PHP/CodeSniffer/Standards/

正常にインストールされていればphpcsコマンドから表示される規約の一覧にCakePHPが追加されているはずです。

$ phpcs -i
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, Squiz and Zend

これで任意のディレクトリのソースをチェックできるようになりました。カレントディレクトリ以下のphpファイルを検査する場合は下記のようなコマンドでOKです。

phpcs --report=summary --report-checkstyle=CakePHP --standard=CakePHP --extensions=php ./

Jenkinsとの統合

CodeSnifferのチェックが出来るようになっても任意で実行するというのはいかにも忘れそうです。ここはモダンにJenkinsからコードを検査するようにすればコミット毎に規約をチェックしてさらにグラフなどを生成してみましょう。Jenkinsから実行する場合は下記のようなコマンドを設定してcheckstyle形式のレポートを生成します。これによりJeninsのcheckstyleプラグインからレポートを読み込んでグラフを生成できます。ただ標準のままですと1つでもエラーがあるとビルドが失敗にマークされてしまうので最後にidコマンドを実行して常にビルドは成功するようにしています。

phpcs --report=checkstyle --report-checkstyle=checkstyle.xml --standard=CakePHP --extensions=php ./ || id

生成されたグラフは下記のような感じです。いい感じですね。

githubなどでコードを公開する事が増えて来た昨今、コーディング規約に準拠した奇麗なソースを書きたいですね。PHP_CodeSnifferとJenkinsの統合を行えば自然とコードを奇麗に書く習慣がつきますので、まだ設定していない方は設定してみる事を強くお勧めします。