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

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

[markdown]

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

> * [PHP_CodeSnifferを使ってWordPressのプラグインやテーマがコーディングスタンダードに準拠しているかチェックする | firegoby](http://firegoby.jp/archives/5532)

## 事前準備

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

> * [composer をあらためてインストールする | deadwood](https://www.d-wood.com/blog/2014/09/12_6881.html)

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

### git clone

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

> * [WordPress-Coding-Standards/WordPress-Coding-Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards)

ぱっと見わからなかったのですが、[firegoby](http://firegoby.jp/archives/5532) さんによると、`php_codesniffer/CodeSniffer/Standards` 以下に配置するとオプションで呼べるようになりそうなので実行します。

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

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

“`prettyprinted
% 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` で登録されたかを確認します。

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

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

> * [Configuration Options · squizlabs/PHP_CodeSniffer Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Configuration-Options#setting-the-installed-standard-paths)
> * [Unable to add WordPress coding standard to PHPCS · Issue #224 · WordPress-Coding-Standards/WordPress-Coding-Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/issues/224)

登録します。

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

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

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

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

“`bash
alias wpcs=”phpcs -p -s -v –standard=WordPress”
“`

### Subset standards

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

“`prettyprinted
% wpcs ./*.php
“`

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

> * [WordPress-Coding-Standards/WordPress-Coding-Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards#subset-standards)

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

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

“`bash
alias wpcs=”phpcs -p -s -v –standard=WordPress-Core”
“`

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

> * [WordPress Coding Standards « WordPress Codex](http://codex.wordpress.org/WordPress_Coding_Standards)
> * [WordPress › WordPress Coding Standards « Make WordPress Core](http://make.wordpress.org/core/handbook/coding-standards/)

## 規約違反を自動修正する

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

> * [PHP_CodeSniffer 2.0.0a2 released – Squiz Labs – Squiz Research and Development](http://www.squizlabs.com/php-codesniffer/2.0.0a2-released)

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

> * [squizlabs/php_codesniffer – Packagist](https://packagist.org/packages/squizlabs/php_codesniffer)

### インストール

composer.json を書き換えます。

“`json:~/.composer/composer.json
{
“require”: {
“squizlabs/php_codesniffer”: “2.0.0RC1”
}
}
“`

update します。

“`prettyprinted
% 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
“`

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

“`prettyprinted
~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/
“`

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

“`prettyprinted
% 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` コマンドで行うとのこと。

> * [Fixing Errors Automatically · squizlabs/PHP_CodeSniffer Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically)
> * [PHPのコーディングスタイルをPHP_CodeSnifferで修正する – Qiita](http://qiita.com/iakio/items/4ce17c46e46de80adec7)

チェックしてみます。

“`prettyprinted
% 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 付きで結果を教えてくれました。

“`prettyprinted
% 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 がちょっと分からないんですが、こんな形でしょうか。

## 補遺

> * [NetBeans を PSR-1/PSR-2 standards 準拠に設定する | deadwood](https://www.d-wood.com/blog/2014/10/08_6995.html)
[/markdown]