高度な使用法

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

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

デフォルトでは、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 用に書かれた sniff のほとんどは、 字下げや位置調整にタブを使用することをサポートしていません。 自分で sniff を作成する際にはスペースではなくタブをチェックするようにすることもできますが、 ファイルをチェックする前に、タブをスペースに変換させるよう PHP_CodeSniffer に指定することもできます。 こうすることで、スペースを想定している既存の sniff でタブを含むファイルを使用することができます。

次の例では、ファイルをチェックする前に PHP_CodeSniffer がすべてのタブを 1 個から 4 個のスペースに置き換えます。 スペースの量は、そのタブが字下げをするカラムによって決まります。

XML でのレポートの表示

PHP_CodeSniffer は、結果を XML 形式で出力することもできます。 これを使用すると、自作のスクリプトで結果を利用するのが簡単になります。 XML 形式のレポートを表示するには、コマンドライン引数 --report=xml を指定します。出力は、次のようになります。

完全なレポートだけでなく、警告を非表示にしたレポートも作成することができます。 この場合は、コマンドライン引数 -n を使用します。

Checkstyle でのレポートの表示

PHP_CodeSniffer は、結果を Checkstyle 形式の XML で出力することができます。これを使用すると、 Checkstyle 形式をサポートしているアプリケーションやスクリプトで その出力結果を使用することができます。Checkstyle 形式のレポートを表示するには、 コマンドライン引数 --report=checkstyle を使用します。出力は、次のようになります。

As with the full report, you can suppress the printing of warnings with the -n command line argument.

CSV でのレポートの表示

PHP_CodeSniffer は、結果を CSV 形式のレポートとして出力することもできます。 これを使用すると、自作のスクリプトで結果を利用するのが簡単になります。 CSV 形式のレポートを表示するには、コマンドライン引数 --report=csv を使用します。出力は、次のようになります。

完全なレポートだけでなく、警告を非表示にしたレポートも作成することができます。 この場合は、コマンドライン引数 -n を使用します。

注意 CSV 出力の最初の行は、情報の並び順を表します。 CSV 出力を使用する際は、このヘッダ行の情報をもとにしてデータを取得するようにしましょう。 CSV の書式が替わったり、新たな情報が追加されたりする可能性もあります。

設定オプションの指定

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

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

設定オプションの削除

PHP_CodeSniffer では、任意の設定オプションを削除してデフォルト値に戻すことができます。 設定オプションの全一覧はこちらです

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

設定オプションの閲覧

現在設定されているオプションの内容を見るには、コマンドライン引数 --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 文の中のすべてのトークンを取得します。