【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)

社内独自のコーディン規約などにあわせてカスタマイズする方法

インストールされるディレクトリ

以下のディレクトリにインストールされている
~/.composer/vendor/squizlabs/php_codesniffer/
-rw-r--r--   1   638 10 28 13:36 CONTRIBUTING.md
-rw-r--r--   1   187 11 26 12:08 CodeSniffer.conf.dist
-rw-r--r--   1  6399 10 28 13:36 README.md
-rw-r--r--   1 10085 10 28 13:36 autoload.php
drwxr-xr-x   6   192 10 28 13:36 bin
-rw-r--r--   1  1083 10 28 13:36 composer.json
-rw-r--r--   1  1533 10 28 13:36 licence.txt
-rw-r--r--   1  6280 10 28 13:36 phpcs.xml.dist
-rw-r--r--   1  7054 10 28 13:36 phpcs.xsd
-rw-r--r--   1   340 10 28 13:36 phpstan.neon
drwxr-xr-x   5   160 10 28 13:36 scripts
drwxr-xr-x  16   512 10 28 13:36 src
drwxr-xr-x   9   288 10 28 13:36 tests

設定ファイルを用意する

CodeSniffer.conf.dist が雛形なのでこれをcpしてやればOK
cd ~/.composer/vendor/squizlabs/php_codesniffer/
cp CodeSniffer.conf.dist CodeSniffer.conf
  • CodeSniffer.conf の中身
    <?php
     $phpCodeSnifferConfig = array (
      'default_standard' => 'PSR2',
      'report_format' => 'summary',
      'show_warnings' => '0',
      'show_progress' => '1',
      'report_width' => '120',
    )
    ?>
    

  • 以下のように変更
    report_format ... summary -> full
    summaryだと判定結果しか表示しないので、どこが問題かを表示するためにfullを設定
    show_warnings ... 0 -> 1
    警告も表示する(鬱陶しければ0でもOK)

判定

  • 判定するソースコード : test.php
    <?php
    /**
     * Test Code
     */
    $is_echo = true;
    echo_phpcs($is_echo);
    function echo_phpcs($is_echo) {
        if ( $is_echo ) { 
            echo "hello php_codesniffer!!\n";
        }   
    }
    

  • 判定
    $ ~/.composer/vendor/bin/phpcs -s test.php
    E 1 / 1 (100%)
    FILE: test.php
    ------------------------------------------------------------------------------------------------------------------------
    FOUND 3 ERRORS AND 1 WARNING AFFECTING 3 LINES
    ------------------------------------------------------------------------------------------------------------------------
      1 | WARNING | [ ] A file should declare new symbols (classes, functions, constants, etc.) and cause no other side
        |         |     effects, or it should execute logic with side effects, but should not do both. The first symbol is
        |         |     defined on line 9 and the first side effect is on line 5.
        |         |     (PSR1.Files.SideEffects.FoundWithSymbols)
      9 | ERROR   | [x] Opening brace should be on a new line
        |         |     (Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine)
     10 | ERROR   | [x] Expected 0 spaces after opening bracket; 1 found
        |         |     (PSR2.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace)
     10 | ERROR   | [x] Expected 0 spaces before closing bracket; 1 found
        |         |     (PSR2.ControlStructures.ControlStructureSpacing.SpaceBeforeCloseBrace)
    ------------------------------------------------------------------------------------------------------------------------
    PHPCBF CAN FIX THE 3 MARKED SNIFF VIOLATIONS AUTOMATICALLY
    ------------------------------------------------------------------------------------------------------------------------
    Time: 81ms; Memory: 6MB
    
    -sをつけて実行すると、エラーとなったルールのキーを教えてくれる
    例:(PSR1.Files.SideEffects.FoundWithSymbols)

    上のソースコードの例ではif文の括弧の内側の両サイドにスペースが入っているのでこれを消したい。しかし関数開始の波括弧 ( { ) で改行させたくない、というときには次のカスタムルールを使う。

カスタムルール

  • 設定

    以下のXMLファイルを作成する
    ~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/{ルール名}/ruleset.xml
    <?xml version="1.0"?>
    <ruleset name="MyStandard">
        <description>ほげほげ会社のコーディング規約</description>
        <rule ref="PSR2">
            <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" />
        </rule>
    </ruleset>
    
    この場合、PSR2のコーディング規約を元に、関数の開始括弧のエラー(BraceOnSameLine)を許容する。(開始括弧で改行しなくてもいいよ、という設定)

  • 判定
    standardオプションに追加したルールを指定して実行する
    $ ~/.composer/vendor/bin/phpcs --standard=MyStandard -s test.php
    E 1 / 1 (100%)
    FILE: test.php
    ------------------------------------------------------------------------------------------------------------------------
    FOUND 2 ERRORS AND 1 WARNING AFFECTING 2 LINES
    ------------------------------------------------------------------------------------------------------------------------
      1 | WARNING | [ ] A file should declare new symbols (classes, functions, constants, etc.) and cause no other side
        |         |     effects, or it should execute logic with side effects, but should not do both. The first symbol is
        |         |     defined on line 9 and the first side effect is on line 5.
        |         |     (PSR1.Files.SideEffects.FoundWithSymbols)
     10 | ERROR   | [x] Expected 0 spaces after opening bracket; 1 found
        |         |     (PSR2.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace)
     10 | ERROR   | [x] Expected 0 spaces before closing bracket; 1 found
        |         |     (PSR2.ControlStructures.ControlStructureSpacing.SpaceBeforeCloseBrace)
    ------------------------------------------------------------------------------------------------------------------------
    PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
    ------------------------------------------------------------------------------------------------------------------------
    Time: 58ms; Memory: 6MB
    

phpcbfによりカスタムルールに沿った整形をする

phpcbfでも同じようにstandardオプションを指定
$ ~/.composer/vendor/bin/phpcbf --standard=MyStandard -s test.php
F 1 / 1 (100%)
PHPCBF RESULT SUMMARY
----------------------------------------------------------------------
FILE                                                  FIXED  REMAINING
----------------------------------------------------------------------
./phpcs/test.php                                      2      1
----------------------------------------------------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 1 FILE
----------------------------------------------------------------------
Time: 63ms; Memory: 6MB

if文の括弧の内側スペースのみが修正されている。
(関数の開始括弧で改行しなくてもよくなった!)
<?php
/**
 * Test Code
 */
$is_echo = true;
echo_phpcs($is_echo);
function echo_phpcs($is_echo) {
    if ($is_echo) {
        echo "hello php_codesniffer!!\n";
    }   
}

※CodeSniffer.confのdefault_standardにカスタムルールを設定しておけば、いちいちオプション指定しなくてすむ

この記事へのコメント

スポンサーリンク