LoginSignup
51
49

More than 5 years have passed since last update.

PHP CodeSniffer を試す

Last updated at Posted at 2016-04-01

PHP_CodeSnifferとは

コード規約のチェックを行うツール。
v2.Xから修正もできるようになったので試してみる

詳細はWiki参照。

インストール

composerのrequire-devに追加すればOK。

各種フレームワークに対応した規約定義も存在する。
今回は FuelPHP のものを使用する。
eviweb/fuelphp-phpcs

{
    "require-dev": {
        "squizlabs/php_codesniffer": "2.*",
        "eviweb/fuelphp-phpcs": "dev-master"
    }
}

composerで追加インストール

$ php composer.phar update squizlabs/php_codesniffer eviweb/fuelphp-phpcs

php_codesniffer から fuelphp-phpcs の設定を参照できるようにする

$ fuel/vendor/bin/phpcs --config-set installed_paths fuel/vendor/eviweb/fuelphp-phpcs/Standards

FuelPHPが追加されていることを確認

$ fuel/vendor/bin/phpcs --config-show
installed_paths: /var/www/html/fuel/vendor/eviweb/fuelphp-phpcs/Standards
$ vendor/bin/phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend and FuelPHP

コード規約チェック

オプション

  • 標準ルール指定
$ fuel/vendor/bin/phpcs  --standard=FuelPHP {path}
  • 拡張子指定
$ fuel/vendor/bin/phpcs  --extensions=php {path}

チェック実行してみる

$ fuel/vendor/bin/phpcs --standard=FuelPHP --extensions=php fuel/app/classes
FILE: /var/www/html/fuel/app/classes/view/welcome/404.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 29 | ERROR | Array with multiple values cannot be declared on a
    |       | single line
----------------------------------------------------------------------

Time: 294ms; Memory: 3.5Mb

デフォルトのファイルがひっかかった。。
Fuelのコード規約では、多項目の配列を一行で定義してもOKなのに。。

$array = array(1, 2, 3, 4);

このチェックを外してみる。

独自ルール作成

  • xmlでルールを定義する
  • 既存のルールを継承して、一部の規約を除外する等の設定が可能
  • 全く新規のチェックを実装することも可能

今回は上記のFuelPHPからArray with multiple values cannot be declared on a single lineというチェックしているルールを除外した独自ルールを作成してみる。

  • チェック処理はfuel/vendor/eviweb/fuelphp-phpcs/Standards/FuelPHP/Sniffs/Arrays/ArrayDeclarationSniff.phpに記述されていた
  • 基本的に$phpcsFile->addError($error, $stackPtr, 'SingleLineNotAllowed')という感じで、addError()の第3引数にルール名がセットされているようなので、エラーメッセージから除外したいルール名を見つけられる
FuelPHP/Sniffs/Arrays/ArrayDeclarationSniff.php
if (($conditionCheck === false) || ($tokens[$conditionCheck]['line'] !== $tokens[$stackPtr]['line'])) {
    $error = 'Array with multiple values cannot be declared on a single line';
    $phpcsFile->addError($error, $stackPtr, 'SingleLineNotAllowed');
    return;
}
ruleset.xml
<?xml version="1.0" encoding="UTF-8"?>

<ruleset name="Fuel_Custom">
    <description>
        Customize Coding standards for FuelPHP
    </description>

    <exclude-pattern>tests/*</exclude-pattern>

    <!-- 継承するルールを指定 -->
    <rule ref="FuelPHP">
        <!-- 除去する個別ルールを指定 -->
        <exclude name="FuelPHP.Arrays.ArrayDeclaration.SingleLineNotAllowed"/>
    </rule>
</ruleset>

作成したruleset.xmlを指定してチェック。

$ fuel/vendor/bin/phpcs --standard=ruleset.xml --extensions=php fuel/app/classes

無事に通った模様。

除外したいルールが1、2個ならコマンド引数で除外したいところだけど、helpを見た限りではできないっぽい。。

修正

$ fuel/vendor/bin/phpcbf fuel/app/classes
  • 自動で修正できれば直してくれる
  • 上記のSingleLineNotAllowedエラーに関しては自動修正してくれなかった。。

気になった点

  • インデントはタブで入力する規則だが、タブタブ半角SPのように先頭がタブだと通ってしまう
51
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
49