高度な使用法

高度な使用法 -- 高度な使用法についての情報

有効なファイル拡張子の指定

デフォルトでは、PHP_CodeSniffer がチェックするのは拡張子が .inc.php のファイルのみです。 これだけでは、PHP_CodeSniffer があなたの使用するファイルをすべて網羅できないかもしれません。 また逆の場合もあるでしょう。 PHP_CodeSniffer では、コマンドライン引数 --extensions によって有効なファイル拡張子を指定することができます。 拡張子は、カンマで区切って指定します。

注意 PHP_CodeSniffer に対して ディレクトリ全体ではなく特定のファイルをチェックするよう指示した場合は、 そのファイルの拡張子を無視します。 有効な拡張子ではない場合や拡張子がない場合でも、そのファイルをチェックします。

次の例では、コマンドライン引数 --extensions.php ファイルのみをチェックするようにしていますが、 main.inc はチェックされます。

注意 ファイル名の直接指定によって拡張子を無視するという PHP_CodeSniffer の機能は、 拡張子のないファイルをチェックするための唯一の方法となります。 ディレクトリ内のすべてのファイルをチェックする場合、 拡張子のないファイルは無視されてしまうので、 それらは個別に指定する必要があります。

ファイルやフォルダの無視

PHP_CodeSniffer で大量のファイルを処理する際に、 特定のファイルやフォルダは処理をスキップしたいということもあるでしょう。 コマンドライン引数 --ignore を使用すると、 PHP_CodeSniffer に処理をスキップさせるファイル名やフォルダ名のパターンを指定することができます。

次の例では、PHP_CodeSniffer がパッケージの tests ディレクトリおよび data ディレクトリをスキップするように指定しています。 これは、PEAR パッケージをチェックする際に テストファイルやデータファイルまではチェックする必要はないという場合に便利です。

設定オプションの指定

PHP_CodeSniffer には、いくつかの設定オプションがあります。 コーディング規約によっては、事前にオプションを設定しておかないと使用できないものもあります。 設定オプションの完全な一覧はこちらです

オプションを設定するには、コマンドライン引数 --config-set を使用します。

設定オプションの閲覧

現在設定されているオプションの内容を見るには、コマンドライン引数 --config-show を使用します。

詳細なトークナイザの出力

注意 この機能は、デバッグのためにのみ用意されているものです。 この機能を使用すると、画面に表示される内容が大幅に増え、 またスクリプトの実行時間も大幅に長くなってしまいます。

PHP_CodeSniffer は、出力内容をいくつかのレベルにわけています。 レベル 2 (コマンドライン引数 -vv で指定します) は、レベル 1 (ファイルごとのトークン数および行数、そして実行所要時間) と同様の情報をすべて含み、さらに詳細なトークナイザの出力も表示します。

PHP_CodeSniffer のトークナイザの出力は、 スコープマップ および レベルマップ が徐々に作成されていく段階を示します。

スコープマップ

スコープマップについては、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

スコープマップの出力はこのようになります。

上のスコープマップには、そのファイルについての次のような情報が含まれます。

スコープマップの出力の最大の目的は、PHP_CodeSniffer のスコープマップをデバッグすることです。これは、 ファイルのチェックをきちんと行うために非常に重要なことです。 しかしそれだけではなく、特定のトークンの型を調べるためにも使用できます。 たとえば、開き波括弧のトークン型が何であるかを忘れてしまった場合は、 トークンマップの出力を見れば、それが T_OPEN_CURLY_BRACKET であって T_OPEN_CURLY_BRACE ではないことがわかります。

レベルマップ

レベルマップについては、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

レベルマップの出力はこのようになります。

上のレベルマップには、そのファイルについての次のような情報が含まれます。

レベルマップの一般的な使用法は、字下げのルールを定義したり (たとえばレベル 4 の深さは空白 16 文字で字下げしなければならないなど) 特定のトークンが特定のスコープ内にあるかどうかを定義したり (たとえば、キーワード function がクラスのスコープにあれば、それをメソッドと判断するなど) することです。

詳細なトークン処理結果の出力

注意 この機能は、デバッグのためにのみ用意されているものです。 この機能を使用すると、画面に表示される内容が大幅に増え、 またスクリプトの実行時間も大幅に長くなってしまいます。

PHP_CodeSniffer は、出力内容をいくつかのレベルにわけています。 レベル 3 (コマンドライン引数 -vvv で指定します) は、レベル 1 (ファイルごとのトークン数および行数、そして実行所要時間) およびレベル 2 (トークナイザの出力) と同様の情報をすべて含み、さらに sniff の実行時のトークン処理結果を出力します。

トークン処理結果については、例を見ていただくのが一番わかりやすいでしょう。 次のようなファイルについて、

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

トークン処理結果の出力は次のようになります。

処理したトークンがすべて、その ID や型そして内容とともに表示されます。 各トークンについて、そのトークン上で実行したすべての sniff と実行所要時間が表示されます。

たとえば、上の出力を見ると、トークン 1 (if キーワード) に対しては ControlSignature、ScopeClosingBrace および ScopeIndent の 3 つの sniff が実行されたことがわかります。 それぞれ短時間で処理されていますが、一番時間がかかったのは ScopeClosingBrace で、トークンを処理するのに 0.0248 秒を要しています。

もうひとつ、上の出力からわかる興味深いことは、 ファイル全体の中で sniff が実行されたトークンが トークン 0、トークン 1 のふたつだけであるということです。 これは、PHP_CodeSniffer にとっては通常の挙動です。 というのも、たいていの sniff は特定のトークンを待ちうけ、 それに続くトークンとあわせて処理するからです。

たとえば、ScopeIndentSniff は、if 文のトークンでしか実行されませんが、実際には if 文の内部のすべての行についての字下げをチェックします。 sniff は、スコープマップ を使用して if 文の中のすべてのトークンを取得します。