PHP CodeSniffer(PHPコードスニファー)は、PHPやJavaScriptで書いたプログラムが、決められたコーディング規約に則って書かれているかをチェックできるツールです。対応しているコーディング規約は、Zend、PEAR、PSR2 などがあります。
私は普段、ZendのPHPコーディング規約に則って、プログラミングをしているのですが、一部例外の規約を設けているため、PHP CodeSniffer でプログラムコードをチェックすると、規約違反となりエラーがずらずらと表示されてしまいます。そこで、PHP CodeSniffer のルールセットをカスタマイズする方法を調べてみました。
PHP CodeSniffer のインストール
今回は、CentOS6.5にインストールしました。PEAR経由でのインストールになります。
yum -y install php-pear ←(PEARがインストールされていない場合は実行) sudo pear install PHP_CodeSniffer
対応しているコーディング規約の確認
標準でZendコーディング規約が対応していることが分かります。
phpcs - i The installed coding standards are PEAR, PSR1, PHPCS, Squiz, PSR2, MySource and Zend
標準の設定では、日本語などのマルチバイト文字のカウント数がおかしくなりますので、文字エンコーディングをUTF8に変更しておきましょう。
sudo phpcs --config-set encoding utf-8
phpcsコマンドは特に指定しなければ、PEARのコーディング規約を元にチェックしますので、他のコーディング規約を使いたい場合は、「--standard=」オプションでコーディング規約を指定します。また、PHPプログラムが入ったディレクトリをチェック対象とすれば、まとめてコーディング規約をチェックしてくれます。
phpcs --standard=Zend sample.php phpcs --standard=Zend Programs_Dir/ ←(まとめてチェック)
Zendコーディング規約でのチェック
私が普段使っているZendのPHPコーディング規約では、変数名には常に小文字で開始する "camelCaps" 方式を使用しなければなりませんが、もろもろの事情によりこの規約を除外しています。
例えば下記のコードは、変数名「$user_name」は、Zendの規約では「$userName」する必要があります。
<?php $user_name = 'サンプル太朗'; echo $user_name;
これをphpcsコマンドでチェックすると、当然コーディング規約違反となりエラーとして表示されます。
phpcs --standard=Zend sample.php FILE: /home/admin/work/sample.php -------------------------------------------------------------------------------- FOUND 1 ERROR(S) AFFECTING 1 LINE(S) -------------------------------------------------------------------------------- 2 | ERROR | Variable "user_name" is not in valid camel caps format 3 | ERROR | Variable "user_name" is not in valid camel caps format --------------------------------------------------------------------------------
ルールセットのカスタマイズ
ルールセットのカスタマイズする場合、直接ルールセットファイルを編集してもかまいませんが、なにかの理由で元に戻したい時に困りますので、カスタマイズしたいルールセットを継承したルールセットを新たに作成して、このルールセットを編集します。PHP CodeSnifferのルールセットファイルは、CentOSの場合「/usr/share/pear/PHP/CodeSniffer/Standards/」以下に配置されています。
新たなルールセットの作成
ルールセット名のディレクトリを作成し、ディレクトリの直下に「ruleset.xml」ファイルを作成します。今回はルールセット名を「Zend_Custom」としました。
sudo mkdir /usr/share/pear/PHP/CodeSniffer/Standards/Zend_Custom sudo vi /usr/share/pear/PHP/CodeSniffer/Standards/Zend_Custom/ruleset.xml
「ruleset.xml」には、ルールセット名と簡単な説明文が必要です。また、3行目の「rule ref=」でZendルールセットを継承し、4行目からの「exclude name=」で除外したいSniff(ルール)を指定します。
<ruleset name="Zend_Custom"> <description>Customization Zend coding-conventions</description> <rule ref="Zend"> <exclude name="Zend.NamingConventions.ValidVariableName.NotCamelCaps"/> <exclude name="Zend.NamingConventions.ValidVariableName.MemberVarNotCamelCaps"/> <exclude name="Zend.NamingConventions.ValidVariableName.StringVarNotCamelCaps"/> </rule> </ruleset>
コーディング規約を「--standard=」オプションで毎回指定するのも面倒ですので、phpcs標準のルールセットを、上で作成した「Zend_Custom」に変更します。
sudo phpcs --config-set default_standard Zend_Custom
最後にphpcsの設定を確認します。下記の表示があればOKです。
phpcs --config-show Array ( [encoding] => utf-8 [default_standard] => Zend_Custom )
先ほどコーディング規約違反でエラーとなった、PHPファイルをチェックしてみます。「-v」オプションを付けると詳細が表示されます。5行目で(0 errors, 0 warnings)と表示され、エラーがないことが分かります。
phpcs -v sample.php Registering sniffs in the Zend_Custom standard... DONE (15 sniffs registered) Creating file list... DONE (1 files in queue) Changing into directory /home/admin/work Processing sample.php [8 tokens in 2 lines]... DONE in < 1 second (0 errors, 0 warnings)
今回は、Zandのルールセットを元に独自のルールセットを作成しましたが、一からルールセットを作成することも可能ですので、独自のコーディング規約を設けている場合でも、PHP CodeSniffer は導入しやすいと思います。コーディング規約のチェックは、PHP CodeSniffer にまかせてしまえば、システム設計やプログラミング作業の時間を増やせるかもしれませんね。
コメント