たいていの場合は基本的な検出で十分です。しかし、
時にはパーサの精度を調整して最善の結果を取得できるようにしなければならないこともあります。
それを行うのが、各パーサメソッドの 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,
),
)
この結果より、"math.php" スクリプトを実行するには少なくとも PHP 4.0.0 が必要であることがわかります。また、拡張モジュール
が読み込まれていなければならないこともわかります。
アプリケーション内のファイルをひとつひとつ個別に調べていくよりは、 ルートパスを指定してそのディレクトリ配下を一括して調べさせたいこともあるでしょう。 デフォルトでは再帰的にパースを行います。つまり、 指定したディレクトリの子ディレクトリもパースの対象となります。 また、拡張子
のファイルのみがパースの対象となります。
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,
),
),
)
つまり、PEAR::File_Find 1.3.0 には PHP 4.3.0 以降と pcre 拡張モジュールが必要だということです。
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',
),
),
cond_code のオフセット 1 は配列で、
デバッグモードが true に設定されている場合にのみ登場します。この配列の中身は次のとおりです。
オフセット 0 は条件となる関数の名前
オフセット 1 は条件となる拡張モジュールの名前
オフセット 2 は条件となる定数の名前