たいていの場合は基本的な検出で十分です。しかし、 時にはパーサの精度を調整して最善の結果を取得できるようにしなければならないこともあります。 それを行うのが、各パーサメソッドの 2 番目のパラメータである $option です。 詳細はパーサオプションの一覧を参照ください。
この "math.php" というスクリプトを実行するために必要な PHP のバージョンを検出することを考えてみましょう。
<?php $nb = bcsub(1.234, 5, 4); if (preg_match('/^-/', $nb)) { echo 'minus'; } ?> |
検出用のスクリプトは、このように非常にシンプルなものとなります。
<?php require_once 'PHP/CompatInfo.php'; $source = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'math.php'; $info = new PHP_CompatInfo(); $info->parseFile($source); // 共通形式のメソッドをつかってもかまいません: $info->parseData($source); ?> |
デフォルトの出力は Array レンダラを用いたものとなります (その他のレンダラについては後述します。 現時点で何も知らなかったとしても心配する必要はありません)。 標準出力に、次のような結果が表示されます。
array ( 'ignored_files' => array ( ), 'ignored_functions' => array ( ), 'ignored_extensions' => array ( ), 'ignored_constants' => array ( ), 'max_version' => '', 'version' => '4.0.0', 'extensions' => array ( 0 => 'bcmath', 1 => 'pcre', ), 'constants' => array ( ), 'tokens' => array ( ), 'cond_code' => array ( 0 => 0, ), ) |
アプリケーション内のファイルをひとつひとつ個別に調べていくよりは、 ルートパスを指定してそのディレクトリ配下を一括して調べさせたいこともあるでしょう。 デフォルトでは再帰的にパースを行います。つまり、 指定したディレクトリの子ディレクトリもパースの対象となります。 また、拡張子 php, php4, inc, phtml のファイルのみがパースの対象となります。
PEAR::File_Find パッケージのバージョン 1.3.0 を実行するのに必要な PHP のバージョンを調べることを考えてみましょう。
まずはアーカイブを http://pear.php.net/package/File_Find/download/1.3.0 からダウンロードし、一時ディレクトリ (今回の例では '/tmp') にそれを展開します。
検出用のスクリプトは、このように非常にシンプルなものとなります。
<?php require_once 'PHP/CompatInfo.php'; $source = '/tmp/File_Find-1.3.0'; $info = new PHP_CompatInfo(); $info->parseDir($source); // 共通形式のメソッドをつかってもかまいません: $info->parseData($source); ?> |
結果は次のようになります。
array ( 'ignored_files' => array ( 0 => '/tmp/File_Find-1.3.0/package.xml', 1 => '/tmp/File_Find-1.3.0/tests/01glob.phpt', 2 => '/tmp/File_Find-1.3.0/tests/02maptree.phpt', 3 => '/tmp/File_Find-1.3.0/tests/03maptreemultiple.phpt', 4 => '/tmp/File_Find-1.3.0/tests/04search.phpt', 5 => '/tmp/File_Find-1.3.0/tests/05search_inside.phpt', 6 => '/tmp/File_Find-1.3.0/tests/06match_shell.phpt', 7 => '/tmp/File_Find-1.3.0/tests/bug2773.phpt', ), 'ignored_functions' => array ( ), 'ignored_extensions' => array ( ), 'ignored_constants' => array ( ), 'max_version' => '', 'version' => '4.3.0', 'extensions' => array ( 0 => 'pcre', ), 'constants' => array ( 0 => '__FILE__', ), 'tokens' => array ( ), 'cond_code' => array ( 0 => 4, ), '/tmp/File_Find-1.3.0/Find.php' => array ( 'ignored_functions' => array ( ), 'ignored_extensions' => array ( ), 'ignored_constants' => array ( ), 'max_version' => '', 'version' => '4.3.0', 'extensions' => array ( 0 => 'pcre', ), 'constants' => array ( ), 'tokens' => array ( ), 'cond_code' => array ( 0 => 4, ), ), '/tmp/File_Find-1.3.0/tests/setup.php' => array ( 'ignored_functions' => array ( ), 'ignored_extensions' => array ( ), 'ignored_constants' => array ( ), 'max_version' => '', 'version' => '4.0.0', 'extensions' => array ( ), 'constants' => array ( 0 => '__FILE__', ), 'tokens' => array ( ), 'cond_code' => array ( 0 => 0, ), ), ) |
注意 |
cond_cond のオフセット 0 には 4 が設定されています。 これは、ソースコード内で (php の defined 関数を用いて) 条件コード (定数の条件) が実装されているということを意味します。 ソースコードをごらんいただければわかるとおり、すべての条件は private なパッケージ定数 FILE_FIND_DEBUG を参照しています。 |
ティップ 定数名を調べるのにいちいちソースコードを読みたくない場合は、 ディレクトリのパース時にオプション debug を指定します。
<?php require_once 'PHP/CompatInfo.php'; $source = '/tmp/File_Find-1.3.0'; $info = new PHP_CompatInfo(); $info->parseDir($source, array('debug' => true)); ?>
'cond_code' => array ( 0 => 4, 1 => array ( 0 => array ( ), 1 => array ( ), 2 => array ( 0 => 'FILE_FIND_DEBUG', ), ), |
オフセット 0 は条件となる関数の名前
オフセット 1 は条件となる拡張モジュールの名前
オフセット 2 は条件となる定数の名前