最小示例代码:
<?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_STRING,前面是T_WHITESPACE,后面是T_function//strong>来检测函数定义。到目前为止,一切都很好。
然而,函数调用只是T_STRING,就像许多其他东西一样,例如参数的"true"常数,在它之前或之后都没有特殊符号。
当T_STRING引用函数名或其他东西之前没有符号告诉我的解释器下一个T_STRING应该引用什么时,我该如何知道它是指函数名还是指其他东西?
如果你的答案是,我需要检查是否存在一个以T_STRING值为名称的函数,这是否意味着不可能有一个名为true((的函数?既然这会与"真"常数相冲突?如果我需要做这样的检查,它会以许多不同的方式使事情复杂化。。。
token_get_all
实际返回的是以下内容(具有已后期处理的令牌名称(:
...,
[26]=>
array(3) {
[0]=>
string(8) "T_STRING"
[1]=>
string(15) "a_function_name"
[2]=>
int(10)
}
[27]=>
string(1) "("
[28]=>
string(1) ")"
token_get_all
只进行标记化,它不将部分解析为逻辑AST。之后的下一步是研究令牌是如何组合在一起的,以及它们形成了什么逻辑单元。在这里,您可以将三个连续的令牌"a_function_name
"、"(
"one_answers")
"解析为函数调用的含义。
您可能想要使用现有的PHP Parser,而不是从头开始重新设计这个步骤。