読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

PHP CodeSnifferを使ってみた1

コーディング規約に沿っていないコードを素早くチェックするために調べたメモ。

https://github.com/squizlabs/PHP_CodeSniffer

このPHP CodeSnifferというのを使ってみた。
Snifferはネットワークのトラフィックを監視するひと・ものの意味らしい。

Composerを使っているプロジェクトだったので(つーかちょっと前に僕が入れた)、Composer経由でインストール。

$ php composer.phar require --dev "squizlabs/php_codesniffer=*"
diff --git a/composer.json b/composer.json
--- a/composer.json
+++ b/composer.json
@@ -2,7 +2,8 @@
     "require-dev": {
-        "phpunit/phpunit": "4.3.*"
+        "phpunit/phpunit": "4.3.*",
+        "squizlabs/php_codesniffer": "*"
$ php composer.phar install

準備完了。

チュートリアル

チュートリアルに沿ってやってみる。

https://github.com/squizlabs/PHP_CodeSniffer/wiki/Coding-Standard-Tutorial

PHPは一行コメントに//と#を許しているが、#のコメントは規約違反にする、というサンプルである。

$ mkdir MyStandard
$ mkdir MyStandard/Sniffs
$ cd MyStandard
$ vi ruleset.xml
<?xml version="1.0"?>
<ruleset name="MyStandard">
  <description>A custom coding standard.</description>
</ruleset>
$ cd Sniffs
$ mkdir Commenting
$ vi Commenting/DisallowHashCommentsSniff.php
<?php
class MyStandard_Sniffs_Commenting_DisallowHashCommentsSniff implements PHP_CodeSniffer_Sniff
{
    public function register()
    {
        return array(T_COMMENT);

    }

    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
    {
        $tokens = $phpcsFile->getTokens();
        if ($tokens[$stackPtr]['content']{0} === '#') {
            $error = 'Hash comments are prohibited; found %s';
            $data  = array(trim($tokens[$stackPtr]['content']));
            $phpcsFile->addError($error, $stackPtr, 'Found', $data);
        }

    }
}

サンプル規約作成終わり。

被験体となるコードファイルを作成。

$ vi test.php
<?php

# Check for valid contents.
if ($obj->contentsAreValid($array)) {
    $value = $obj->getValue();

    # Value needs to be an array.
    if (is_array($value) === false) {
        # Error.
        $obj->throwError();
        exit();
    }
}

?>

実行してみる。

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

FILE: /vagrant/test.php
--------------------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 3 LINES
--------------------------------------------------------------------------------
 2 | ERROR | Hash comments are prohibited; found # Check for valid contents.
 6 | ERROR | Hash comments are prohibited; found # Value needs to be an array.
 8 | ERROR | Hash comments are prohibited; found # Error.
--------------------------------------------------------------------------------

Time: 90ms; Memory: 3.25Mb

出た。


自前の規約を作るのに、registerとprocessを用意してゴニョゴニョすれば良さそう、というのをここだけやってみてわかった。

が、このゴニョゴニョ感は手を出すと火傷しそうなので、いくつか出ているフレームワークの規約から拝借してみよう。