[PHP] PHP_CodeSniffer + WordPress-Coding-Standards をインストールする

WordPress のコーディングスタンダードをチェックするツールを知ったのでインストールします。

こちらを参考にさせて頂きました。

Contents

事前準備

事前に composer で PHP_CodeSniffer をインストールしておきます。

インストールとつかいかた

git clone

git clone でファイルを配置するよう。

ぱっと見わからなかったのですが、firegoby さんによると、php_codesniffer/CodeSniffer/Standards 以下に配置するとオプションで呼べるようになりそうなので実行します。

% git clone git@github.com:WordPress-Coding-Standards/WordPress-Coding-Standards.git \
~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/WordPress

こうなりました。
オプションには Zend などもあるようですね。

% ls .composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/
AbstractPatternSniff.php       Generic/                       PEAR/                          PSR2/                          Zend/
AbstractScopeSniff.php         IncorrectPatternException.php  PHPCS/                         Squiz/
AbstractVariableSniff.php      MySource/                      PSR1/                          WordPress/

phpcs –config-set installed_paths

phpcs -i で登録されたかを確認します。

% phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend

git clone したディレクトリ直下に ruleset.xml が無いからなのか、どうもインストールしたパスを登録しなければならないよう。

登録します。

% phpcs --config-set installed_paths ~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/WordPress

こんどはOK。
(登録すれば設置場所はどこでもいいのかもしれません)

% phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend, WordPress, WordPress-Core, WordPress-Extra and WordPress-VIP

あわせてエイリアスも設定しておきます。

alias wpcs="phpcs -p -s -v --standard=WordPress"

Subset standards

エイリアスを設定したので、下記で実行します。
しかし、あきらかにへんな記述をしてチェックしても、エラーにならないです。

% wpcs ./*.php

vccw 環境で同じファイルをチェックしてみるとエラーが出ました。
コマンドを確認すると、違うサブセットを呼んでいました。

[vagrant@wordpress]$ which wpcs
alias wpcs='phpcs -p -s -v --standard=WordPress-Core'
        ~/.composer/vendor/bin/phpcs

ローカルでも同じオプションで実行すると、同じ振る舞いとなりました。

alias wpcs="phpcs -p -s -v --standard=WordPress-Core"

このあたりの違いや経緯は分かりませんが、WordPress が元々の規約で WordPress-Core というより厳しい規約に変わったように読み取れます。

規約違反を自動修正する

現在開発中の Ver.2.0 から、規約違反を自動修正する機能が付くようです。

確認すると 2.0RC1 がありました。
インストールしてみます。

インストール

composer.json を書き換えます。

~/.composer/composer.json
{
    "require": {
        "squizlabs/php_codesniffer": "2.0.0RC1"
    }
}

update します。

% cd ~/.composer/
% composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing squizlabs/php_codesniffer (1.5.4)
  - Installing squizlabs/php_codesniffer (2.0.0RC1)
    Downloading: 100%
Writing lock file
Generating autoload files

アップデートすると、以下のディレクトリの内容も変わってしまいました。

~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/

上述のとおり、あらためて適当なディレクトリに git clone して設定し直します。
WordPress-Coding-Standards へのパスはフルパスで書きます。

% git clone git@github.com:WordPress-Coding-Standards/WordPress-Coding-Standards.git
% phpcs --config-set installed_paths /Users/****/projects_github/WordPress-Coding-Standards
% phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz, Zend, WordPress, WordPress-Core, WordPress-Extra and WordPress-VIP

つかいかた

チェックは phpcs、修正は phpcbf コマンドで行うとのこと。

チェックしてみます。

% phpcs -p -s -v --standard=WordPress-Core functions.php
    :
FILE: /Users/****/projects/****/src/functions.php
--------------------------------------------------------------------------------
FOUND 31 ERRORS AFFECTING 15 LINES
--------------------------------------------------------------------------------
  9 | ERROR | [x] Inline control structures are not allowed
    |       |     (Generic.ControlStructures.InlineControlStructure.NotAllowed)
 30 | ERROR | [x] TRUE, FALSE and NULL must be lowercase; expected "null" but
    |       |     found "NULL" (Generic.PHP.LowerCaseConstant.Found)
 84 | ERROR | [ ] No space before closing parenthesis is prohibited
    |       |     (WordPress.WhiteSpace.ControlStructureSpacing)
--------------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------

上記、省略していますが、チェックの付いたものを phpcbf で修正してくれそうです。
コマンドを実行すると、diff 付きで結果を教えてくれました。

% phpcbf -p -s -v --standard=WordPress-Core functions.php
Registering sniffs in the WordPress Core standard... DONE (20 sniffs registered)
Creating file list... DONE (1 files in queue)
Changing into directory /Users/****/projects/****/src
Processing functions.php [PHP => 484 tokens in 90 lines]... DONE in 17ms (31 errors, 0 warnings)
--- functions.php
+++ PHP_CodeSniffer
@@ -6,7 +6,7 @@
-if ( ! isset( $content_width ) ) $content_width = 630;
+if ( ! isset( $content_width ) ) {  $content_width = 630; }
@@ -27,7 +27,7 @@
 function frontpage_slides() {
    $header_images = get_uploaded_header_images();
    if ($header_images) {
-       $str = NULL;
+       $str = null;
        foreach ($header_images as $key => $value) {
            $str .= '{image: "' . $value['url']  . '"},';
        }
Patched 1 file
Time: 193ms; Memory: 3.5Mb

のこっている ERROR がちょっと分からないんですが、こんな形でしょうか。

補遺