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を用意してゴニョゴニョすれば良さそう、というのをここだけやってみてわかった。
が、このゴニョゴニョ感は手を出すと火傷しそうなので、いくつか出ているフレームワークの規約から拝借してみよう。