PHP CodeSniffer ルールセットのカスタマイズ方法

プログラム
プログラムPHP
スポンサーリンク

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 にまかせてしまえば、システム設計やプログラミング作業の時間を増やせるかもしれませんね。

コメント

タイトルとURLをコピーしました