デフォルトでは、PHP_CodeSniffer がチェックするのは拡張子が .inc か .php のファイルのみです。 これだけでは、PHP_CodeSniffer があなたの使用するファイルをすべて網羅できないかもしれません。 また逆の場合もあるでしょう。 PHP_CodeSniffer では、コマンドライン引数 --extensions によって有効なファイル拡張子を指定することができます。 拡張子は、カンマで区切って指定します。
例 54-1.php ファイルのみのチェック
|
例 54-2.php、.inc および .lib ファイルのみのチェック
|
注意 PHP_CodeSniffer に対して ディレクトリ全体ではなく特定のファイルをチェックするよう指示した場合は、 そのファイルの拡張子を無視します。 有効な拡張子ではない場合や拡張子がない場合でも、そのファイルをチェックします。
次の例では、コマンドライン引数 --extensions で .php ファイルのみをチェックするようにしていますが、 main.inc はチェックされます。
例 54-3ファイルを直接指定した場合は拡張子指定が無視される
$ phpcs --extensions=php /path/to/code/main.inc
注意 ファイル名の直接指定によって拡張子を無視するという PHP_CodeSniffer の機能は、 拡張子のないファイルをチェックするための唯一の方法となります。 ディレクトリ内のすべてのファイルをチェックする場合、 拡張子のないファイルは無視されてしまうので、 それらは個別に指定する必要があります。
PHP_CodeSniffer で大量のファイルを処理する際に、 特定のファイルやフォルダは処理をスキップしたいということもあるでしょう。 コマンドライン引数 --ignore を使用すると、 PHP_CodeSniffer に処理をスキップさせるファイル名やフォルダ名のパターンを指定することができます。
次の例では、PHP_CodeSniffer がパッケージの tests ディレクトリおよび data ディレクトリをスキップするように指定しています。 これは、PEAR パッケージをチェックする際に テストファイルやデータファイルまではチェックする必要はないという場合に便利です。
例 54-4テストファイルやデータファイルの無視
|
PHP_CodeSniffer には、いくつかの設定オプションがあります。 コーディング規約によっては、事前にオプションを設定しておかないと使用できないものもあります。 設定オプションの完全な一覧はこちらです。
オプションを設定するには、コマンドライン引数 --config-set を使用します。
例 54-5オプションの設定
|
現在設定されているオプションの内容を見るには、コマンドライン引数 --config-show を使用します。
例 54-6設定オプションの閲覧
|
注意 この機能は、デバッグのためにのみ用意されているものです。 この機能を使用すると、画面に表示される内容が大幅に増え、 またスクリプトの実行時間も大幅に長くなってしまいます。
PHP_CodeSniffer は、出力内容をいくつかのレベルにわけています。 レベル 2 (コマンドライン引数 -vv で指定します) は、レベル 1 (ファイルごとのトークン数および行数、そして実行所要時間) と同様の情報をすべて含み、さらに詳細なトークナイザの出力も表示します。
PHP_CodeSniffer のトークナイザの出力は、 スコープマップ および レベルマップ が徐々に作成されていく段階を示します。
スコープマップについては、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、
<?php
if ($condition) {
echo 'Condition was true';
}
?> |
スコープマップの出力はこのようになります。
例 54-7スコープマップの出力例
|
上のスコープマップには、そのファイルについての次のような情報が含まれます。
スコープトークン if が、トークン 1 で見つかりました (トークン 0 は PHP の開始タグとなります)。
if 文の開始部である開き波括弧が、トークン 7 で見つかりました。
if 文の終了部である閉じ波括弧が、トークン 15 で見つかりました。
トークン 8 から 15 はすべて、トークン 7 (開き波括弧) で開かれたスコープに含まれます。これは、これらのトークンがすべて if 文の内部にあることを表します。
スコープマップの出力の最大の目的は、PHP_CodeSniffer のスコープマップをデバッグすることです。これは、 ファイルのチェックをきちんと行うために非常に重要なことです。 しかしそれだけではなく、特定のトークンの型を調べるためにも使用できます。 たとえば、開き波括弧のトークン型が何であるかを忘れてしまった場合は、 トークンマップの出力を見れば、それが T_OPEN_CURLY_BRACKET であって T_OPEN_CURLY_BRACE ではないことがわかります。
レベルマップについては、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、
<?php
if ($condition) {
echo 'Condition was true';
}
?> |
レベルマップの出力はこのようになります。
例 54-8レベルマップの出力例
|
上のレベルマップには、そのファイルについての次のような情報が含まれます。
スコープを開始する開き波括弧が、トークン 7 で見つかりました。これは、トークン 1 で定義された if 文のスコープを開始します。
トークン 8 から 15 はすべて、トークン 7 (開き波括弧) で開かれたスコープに含まれます。これらのすべてのトークンはレベル 1 です。つまり、これらはひとつのスコープ条件で囲まれているということです。すべて、ひとつの条件 (if 文) に囲まれています。
レベルマップの一般的な使用法は、字下げのルールを定義したり (たとえばレベル 4 の深さは空白 16 文字で字下げしなければならないなど) 特定のトークンが特定のスコープ内にあるかどうかを定義したり (たとえば、キーワード function がクラスのスコープにあれば、それをメソッドと判断するなど) することです。
注意 この機能は、デバッグのためにのみ用意されているものです。 この機能を使用すると、画面に表示される内容が大幅に増え、 またスクリプトの実行時間も大幅に長くなってしまいます。
PHP_CodeSniffer は、出力内容をいくつかのレベルにわけています。 レベル 3 (コマンドライン引数 -vvv で指定します) は、レベル 1 (ファイルごとのトークン数および行数、そして実行所要時間) およびレベル 2 (トークナイザの出力) と同様の情報をすべて含み、さらに sniff の実行時のトークン処理結果を出力します。
トークン処理結果については、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、
<?php
if ($condition) {
echo 'Condition was true';
}
?> |
トークン処理結果の出力は次のようになります。
例 54-9トークン処理結果の出力例
|
処理したトークンがすべて、その ID や型そして内容とともに表示されます。 各トークンについて、そのトークン上で実行したすべての sniff と実行所要時間が表示されます。
たとえば、上の出力を見ると、トークン 1 (if キーワード) に対しては ControlSignature、ScopeClosingBrace および ScopeIndent の 3 つの sniff が実行されたことがわかります。 それぞれ短時間で処理されていますが、一番時間がかかったのは ScopeClosingBrace で、トークンを処理するのに 0.0248 秒を要しています。
もうひとつ、上の出力からわかる興味深いことは、 ファイル全体の中で sniff が実行されたトークンが トークン 0、トークン 1 のふたつだけであるということです。 これは、PHP_CodeSniffer にとっては通常の挙動です。 というのも、たいていの sniff は特定のトークンを待ちうけ、 それに続くトークンとあわせて処理するからです。
たとえば、ScopeIndentSniff は、if 文のトークンでしか実行されませんが、実際には if 文の内部のすべての行についての字下げをチェックします。 sniff は、スコープマップ を使用して if 文の中のすべてのトークンを取得します。