PHP コードのコーディング規約をチェックすることにした (composer/phing/PHP_CodeSniffer)

Web をぶらぶらしていたら PHP のコーディング規約として PSR(Proposing a Standards Recommendation) という規約があることに気づきました。

今開発しているプロジェクトに PSR のチェックを書けるためにあれこれしたのものをメモします。

まずは composer をインストールする

現在のプロジェクトでは chef を使って PHP パッケージをインストールしているのですが、
もうちょっと管理しやすいよう composer を使って依存パッケージを入れなおします。
composer は Bundler 相当のツールで、プロジェクトディレクトリに依存パッケージをインストールしてくれます。

composer のインストールは以下のコマンドを使います。

$ curl -sS https://getcomposer.org/installer | php

コマンドを実行すると composer.phar という PHP スクリプトが保存されるので、
このファイルをプロジェクトのルートディレクトリに配置します。

次に composer.json という定義ファイルを作成します。
php composer.phar init コマンドで対話式に生成することもできるようですが、
ここでは割愛して CI 用に設定した内容を掲載します。composer.phar と同じディレクトリに配置してください。

{
    "require-dev": {
        "phing/phing": "*",
        "squizlabs/php_codesniffer": "*"
    },
    "config": {
        "bin-dir" : "bin/"
    }
}

この定義では require-dev として開発用のパッケージである phing, php_codesniffer を指定しています。
それぞれバージョン指定はしていない(* を指定)ので、最新の安定版を利用します。
パッケージを探す際は [packagist.org:title=packagist.org] で検索すると良いようです。
ちなみに bin-dir の指定は実行ファイルを bin/ 以下に配置する指定です(デフォルトは vendor/bin)。

最後に composer を実行して依存パッケージをダウンロードしてくるだけです。

$ php composer.phar install
$ ls bin/
pdepend  phing  phpcpd  phpcs  phpmd  phpunit

PSR チェックをする (PHP_CodeSniffer)

ソースコードがあるコーディング規約に準拠しているかを調べるツールとして PHP_CodeSniffer があります。
PHP_CodeSniffer には PSR の定義が含まれているので、インストール直後から PSR のチェックを行うことができます。

PHP_CodeSniffer は先ほどの composer でインストール済みなので、phpcs コマンドでチェックすることができます。

$ bin/phpcs --standard=PSR1 src/
    • standard オプションでコーディング規約を指定します。

PSR1 を指定した場合は命名を中心とした規約を、PSR2 を指定した場合は PSR1 に加えインデントなどのスタイル系の規約をチェックします。

あとはこつこつ直していくだけですね。
なお、CakePHPFuelPHP など、フレームワーク毎のコーディング規約もパッケージ化されているようなので、
使っているフレームワークに合わせて切り替えると良さそうです。

phing から PHP_CodeSniffer を呼び出す

PHP_CodeSniffer でコーディング規約のチェックができるようになったのですが、
いちいちコマンドラインで呼び出していくのが面倒なので PHP のビルドツールである phing から呼び出せるようにしておきます。

どうやら というタグが使えるようなので、これを使います。
build.xml に phpcs というタスクを定義しておきます。

  <target name="phpcs" description="Generate phpcs.xml using PHP_CodeSniffer" >
    <phpcodesniffer standard="PSR2" file="${targetDir}/" allowedFileExtensions="php" >
    </phpcodesniffer>
  </target>

ここでは $targetDir という変数をつかっているので、コピペする際は注意してください。

タスクを定義したあとは、コマンドラインから次のようにチェックを起動できます。

$ bin/phing phpcs

Jenkins にチェックさせる

Jenkins の checkstyle プラグインを使うことで、チェックした結果を可視化することができます。

build.xml の phpcs タスクに formatter を書き足しておけば、checkstyle 用の XML を生成させることができます。

  <target name="phpcs" description="Generate phpcs.xml using PHP_CodeSniffer" >
    <mkdir dir="${outputDir}" />
    <phpcodesniffer standard="PSR2" file="${targetDir}/" allowedFileExtensions="php" >
      <formatter type="checkstyle"
                 outfile="${outputDir}/phpcs.xml"/>
    </phpcodesniffer>
  </target>

まとめ

  • composer でパッケージ管理しておくと便利
  • PHP_CodeSniffer でコーディング規約のチェックすると整理する気になる
  • ただし PSR は口うるさいので困る
    • 既に他の人に使ってもらってるものだとインターフェース直しづらい…