- 2006-09-21 (木) 17:14
- PHP
PHP_CodeSnifferはPHPのコードスタイルをチェックするツールです。0.1.0ではPEARのコーディング基準に適合するかどうかを確認できますので、いくつか試してみました。
まずは簡単にPHP_CodeSnifferの使い方から。
PHP_CodeSnifferを使う
インストール
pearコマンドでインストールするだけです。
$ pear install PHP_CodeSniffer-0.1.0
CLI環境ではPEARパッケージに含まれているphpcsコマンドでチェックができます。
使用例
まずありがちなサンプルファイルでチェックしてみます。チェックするソースは以下です。
< ?php class Hello { var $message = null; function __construct($message) { $this->message = $message; } function hello() { echo("Hello! PHP"); echo($this->message); } } $obj = new Hello("Cake is sweet."); $obj->hello(); ?>
phpcsでチェックします。
$ phpcs -v hello.php Registering sniffs... DONE Processing hello.php [93 tokens in 17 lines]... DONE in < 1 second FILE: hello.php -------------------------------------------------------------------------------- FOUND 8 ERROR(S) AND 0 WARNING(S) AFFECTING 6 LINE(S) -------------------------------------------------------------------------------- [LINE 3] ERROR: Line indented incorrectly. Expected at least 4 spaces, but found 2. [LINE 5] ERROR: Opening function brace should be on a new line. [LINE 5] ERROR: Line indented incorrectly. Expected 4 spaces but found 2. [LINE 6] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. [LINE 9] ERROR: Opening function brace should be on a new line. [LINE 9] ERROR: Line indented incorrectly. Expected 4 spaces but found 2. [LINE 10] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. [LINE 11] ERROR: Line indented incorrectly. Expected at least 8 spaces, but found 4. -------------------------------------------------------------------------------- [/code] <p>いろいろ出てきましたが、ほとんどがインデントに関するものです。(PEARではインデントは4スペースが推奨です。)あとメソッド定義で[{]を続けて書くのがまずいようです。ソースを修正して再度チェックします。 $ phpcs -v hello1.php Registering sniffs... DONE Processing hello1.php [95 tokens in 19 lines]... DONE in < 1 second [/code] <p>無事エラーはなくなりました。 <h2>PEARをチェック</h2> <p>PEAR.phpで試してみました。これは適合して当たり前でしょう。</p> $ phpcs -v --report=summary PEAR.php Registering sniffs... DONE Processing PEAR.php [5550 tokens in 1101 lines]... DONE in 2 seconds PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- PEAR.php 117 30 -------------------------------------------------------------------------------- A TOTAL OF 117 ERROR(S) AND 30 WARNING(S) WERE FOUND IN 1 FILE(S) --------------------------------------------------------------------------------
出まくってますね。。。エラー内容を見るとさすがにインデント関係は出ていないですが、カンマや条件文でエラーが出ています。あと改行がCR+LFになってますね。これは良いのかな?
PHP_CodeSnifferをチェック
つぎはPHP_CodeSniffer自身です。PHP/CodeSnifferディレクトリ以下をチェックしました。
$ phpcs -v --reort=summary PHP/CodeSniffer Registering sniffs... DONE (snip) PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- PHP/CodeSnifferCommentParserAbstractDocElement.php 0 8 PHP/CodeSnifferCommentParserAbstractParser.php 0 13 PHP/CodeSnifferCommentParserClassCommentParser.php 0 7 PHP/CodeSnifferCommentParserCommentElement.php 0 7 PHP/CodeSnifferCommentParserDocElement.php 0 0 PHP/CodeSnifferCommentParserFunctionCommentParser.php 0 4 PHP/CodeSnifferCommentParserMemberCommentParser.php 0 2 PHP/CodeSnifferCommentParserPairElement.php 0 4 PHP/CodeSnifferCommentParserParameterElement.php 0 6 PHP/CodeSnifferCommentParserParserException.php 0 0 PHP/CodeSnifferCommentParserSingleElement.php 0 4 PHP/CodeSnifferException.php 0 0 PHP/CodeSnifferFile.php 0 62 PHP/CodeSnifferSniff.php 0 4 PHP/CodeSnifferSniffException.php 0 0 PHP/CodeSnifferStandardsAbstractPatternSniff.php 0 33 PHP/CodeSnifferStandardsAbstractScopeSniff.php 0 15 PHP/CodeSnifferStandardsAbstractVariableSniff.php 0 14 PHP/CodeSnifferStandardsIncorrectPatternException.php 0 0 ...ferStandardsPEARSniffsCommentingInlineCommentSniff.php 0 1 ...StandardsPEARSniffsConstantsValidConstantNameSniff.php 0 11 ...rdsPEARSniffsControlStructuresControlSignatureSniff.php 0 1 ...eSnifferStandardsPEARSniffsFilesIncludingFileSniff.php 0 8 ...CodeSnifferStandardsPEARSniffsFilesLineLengthSniff.php 0 3 ...tandardsPEARSniffsMethodsFunctionCallSignatureSniff.php 0 9 ...ardsPEARSniffsMethodsMethodCallArgumentSpacingSniff.php 0 11 ...rStandardsPEARSniffsMethodsOpeningMethodBraceSniff.php 0 5 ...erStandardsPEARSniffsMethodsValidDefaultValueSniff.php 0 3 ...odeSnifferStandardsPEARSniffsMiscShortOpenTagSniff.php 0 5 ...dardsPEARSniffsNamingConventionsValidClassNameSniff.php 0 4 ...dsPEARSniffsNamingConventionsValidFunctionNameSniff.php 0 19 ...nifferStandardsPEARSniffsPHPLowerCaseConstantSniff.php 0 2 ...StandardsPEARSniffsStatementsMultipleStatementSniff.php 0 21 ...StandardsPEARSniffsWhiteSpaceScopeClosingBraceSniff.php 0 5 ...ifferStandardsPEARSniffsWhiteSpaceScopeIndentSniff.php 0 13 PHP/CodeSnifferTokens.php 0 0 -------------------------------------------------------------------------------- A TOTAL OF 0 ERROR(S) AND 304 WARNING(S) WERE FOUND IN 36 FILE(S) --------------------------------------------------------------------------------
WARNINGは出ていますが、ERRORは無いです。さすがです。
CakePHPをチェック
おまけでCakePHPです。CakePHPのソースは荒っぽいところが残っているので興味津々です。(エラーが多く出そうで:-P)[cake/dispatcher.php]をチェックしてみました。
$ phpcs -v --report=summary cake/dispatcher.php Registering sniffs... DONE Processing dispatcher.php [3450 tokens in 430 lines]... DONE in 1 second PHP CODE SNIFFER REPORT SUMMARY -------------------------------------------------------------------------------- FILE ERRORS WARNINGS -------------------------------------------------------------------------------- cakedispatcher.php 301 26 -------------------------------------------------------------------------------- A TOTAL OF 301 ERROR(S) AND 26 WARNING(S) WERE FOUND IN 1 FILE(S) --------------------------------------------------------------------------------
301 ERROR(S)!!と期待(?)を裏切らない結果になったのですが、エラー内容を見るとほとんどはインデントのエラーでした。なのでそれを除外するとエラーは26個になりました。[エラー内容(除くインデントエラー)]
エラーはif文、foreach文のスペース、メソッド宣言でのブレース位置くらいですね。まあCakePHPはPEARコーディング規約で書かれているわけではないですけど、わりと適合していたのは意外でした。
PEAR標準ソースを書く
こうしていくつかのソースを見てみるとおおよそひっかかりそうな箇所が見えてきます。PEARコーティング規約に適合するソースを書くにあたってとりあえず気をつけておく点を並べてみました。
- インデントは4スペース
- メソッド定義にてブレース[{]は次の行に書く
- if,foreachなので制御構造ではキーワードと[(]の間にスペースを入れる
- 改行はLF?
- 一行85桁まで。
- 変数の代入式を並べる時は値が縦に並ぶようにスペースを入れる。
cvsやsvnにコミットする時に自動的にチェックするとかunitテストに盛り込むなどアイデア次第で面白い事ができそうです。
- Newer: 猫はバイク好き?
- Older: PHPで$a{N}表現
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/09/php_codesniffer.html/trackback
- Listed below are links to weblogs that reference
- PHP_CodeSnifferを試してみる from Shin x blog