takedajs ログ

備考録

PHP_CodeSnifferでコードの規約チェックと自動整形を行う

PHPで書かれたコードの規約チェックと自動整形を行ってくれる「PHP_CodeSniffer」を導入して試してみました。 2系から自動整形に対応したみたいです。

この記事では、PHPで書いたサンプルコードの規約チェックと自動整形を行った結果までを書いています。

開発環境

  • Vagrantで構築
  • OS: CentOS 7
  • PHP: 5.6.30

PHP_CodeSniffer導入

PHP_CodeSnifferの安定バージョン確認
http://pear.php.net/package/PHP_CodeSniffer

2017/5/3現在で2.8.1がstableなので、Composerで2系を導入

$ php composer.phar require "squizlabs/php_codesniffer=2.*"

導入されたパッケージ確認

$ view composer.json

{
    "require": {
        "squizlabs/php_codesniffer": "2.*"
    }
}

PHP_CodeSniffer導入確認
コードの規約チェック(phpcs)と自動整形(phpcbf)のコマンドが利用できるか確認

$ ./vendor/bin/phpcs -h
$ ./vendor/bin/phpcbf -h

コードの規約チェックと自動整形

以下のサンプルコードを利用してコードの規約チェックと整形を行って行きます。

コード規約チェック

利用できるコーディング規約を確認

$ ./vendor/bin/phpcs -i

The installed coding standards are MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend

今回はPSR2を利用してチェックを行う
コマンドを叩くと、エラーが発生

$ ./vendor/bin/phpcs --standard=PSR2 test.php

PHP Fatal error:  Call to undefined function simplexml_load_string() in
/vagrant/vendor/squizlabs/php_codesniffer/CodeSniffer.php on line 697

php-xmlが導入されていないのが原因だと分かり、php-xmlを導入

$ sudo yum install --enablerepo=remi-php56 php-xml

改めてPSR2を利用したチェックを行うと正常に動作した。
修正箇所が表示され、どこを修正すれば良いか分かります。

$ ./vendor/bin/phpcs --standard=PSR2 test.php

FILE: /vagrant/test.php
----------------------------------------------------------------------
FOUND 2 ERRORS AND 1 WARNING AFFECTING 3 LINES
----------------------------------------------------------------------
 5 | ERROR   | [x] Expected 1 space after closing parenthesis; found
   |         |     "       "
 7 | WARNING | [x] Usage of ELSE IF is discouraged; use ELSEIF
   |         |     instead
 9 | ERROR   | [x] Expected 1 newline at end of file; 0 found
----------------------------------------------------------------------
PHPCBF CAN FIX THE 3 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

Time: 458ms; Memory: 3.25Mb

上記の結果表示だと修正箇所が英語で書かれいて分かりずらいです。
そんな時は、--report=diffオプションを付けると、指摘箇所と修正後のdiffを表示してくれて便利です。

$ ./vendor/bin/phpcs --standard=PSR2 --report=diff test.php

--- test.php
+++ PHP_CodeSniffer
@@ -2,8 +2,8 @@

 $test = 1;

-if ($test == 1)       {
+if ($test == 1) {
     echo $test;
-} else if ($test == 2) {
+} elseif ($test == 2) {
     echo $test;
-}
\ ファイル末尾に改行がありません
+}

コード自動整形

PSR2を利用して自動整形を行う
コマンドを叩くと、エラーが発生(こっちでもエラー発生...orz)

$  ./vendor/bin/phpcbf --standard=PSR2 test.php

Processing test.php [PHP => 24 tokens in 7 lines]... DONE in 14ms (1 fixable violations)
        => Fixing file: 0/1 violations remaining [made 2 passes]... DONE in 3ms
sh: patch: コマンドが見つかりません
Array
(
)
Returned: 127
Time: 258ms; Memory: 3Mb

patchコマンドを実行できないのが原因なので、patchを導入

$ sudo yum install patch

改めてPSR2を利用した自動整形を行うと正常に動作した

$ ./vendor/bin/phpcbf --standard=PSR2 test.php

Changing into directory /vagrant
Processing index.php [PHP => 51 tokens in 9 lines]... DONE in 15ms (3 fixable violations)
        => Fixing file: 0/3 violations remaining [made 3 passes]... DONE in 6ms
Patched 1 file
Time: 507ms; Memory: 3.25Mb

以下、自動整形される前と後のコードです。phpcsコマンドを叩いて指摘された箇所が修正されているのが分かります。

自動整形前のコード

自動整形後のコード
(Gist上では最後の行に改行が表示されていないが、自動整形されたコードは改行されていました。)

まとめ

コマンドを叩くだけでコードの規約チェックと自動整形を行ってくれるのは便利ですね。 今回はコード規約としてPSR2を利用しましたが、独自にカスタマイズ規約を作成して読み込ませる ことも可能みたいです。自動整形などはこういったツールを使うのが良いですね。

参考

https://github.com/squizlabs/PHP_CodeSniffer

https://github.com/squizlabs/PHP_CodeSniffer/wiki
(使い方やオプションが記述されています。)

PHP 5.5 などで PHP-XML などのインストール方法 - ワイ、そして IT ときどき何か。