最小限のコード例:
<?php
$avarname = 'a var value';
function a_function_name($a_parameter = true)
{
// a comment
}
a_function_name();
token_get_all() を使用した構造:
T_OPEN_TAG: <?php
T_WHITESPACE:
T_VARIABLE: $avarname
T_WHITESPACE:
T_WHITESPACE:
T_CONSTANT_ENCAPSED_STRING: 'a var value'
T_WHITESPACE:
T_FUNCTION: function
T_WHITESPACE:
T_STRING: a_function_name
T_VARIABLE: $a_parameter
T_WHITESPACE:
T_WHITESPACE:
T_STRING: true
T_WHITESPACE:
T_WHITESPACE:
T_COMMENT: // a comment
T_WHITESPACE:
T_WHITESPACE:
T_STRING: a_function_name
T_WHITESPACE:
ご覧のとおり、 T_WHITESPACEが前にあり、 T_FUNCTIONが前にあるT_STRINGをチェックすることで、関数定義を検出できます。ここまでは順調ですね。
ただし、関数呼び出しは単なるT_STRINGであり、パラメーターの「真の」定数など、他の多くのものと同様に、その前後に特別な記号はありません。
T_STRING が次のT_STRINGが何を参照することになっているのかをインタプリタに伝える前にシンボルがない場合、T_STRINGが関数名または何か他のものを参照しているかどうかをどのように知ることができますか?
あなたの答えが、T_STRING 値の名前を持つ関数が存在するかどうかを確認する必要があるという場合、それは true() という関数が存在できないということですか? それは「真の」定数と競合するのでしょうか?そのようなチェックを行う必要がある場合、さまざまな点で事態が複雑になります...