Php 如何在AST中获取变量名和值
我正在使用查找PHP程序的AST。例如: 代码 我试图找到的是Php 如何在AST中获取变量名和值,php,debugging,abstract-syntax-tree,php-parser,Php,Debugging,Abstract Syntax Tree,Php Parser,我正在使用查找PHP程序的AST。例如: 代码 我试图找到的是变量=\u POST和new=nonexist 我使用了leavenode函数来访问\u POST和变量。查找\u POST和变量的我的代码如下: public function leaveNode(Node $node) { $collect_to_print= array(); if ($node instanceof ArrayDimFetch &&
变量=\u POST
和new=nonexist
我使用了leavenode
函数来访问\u POST
和变量
。查找\u POST
和变量的我的代码如下:
public function leaveNode(Node $node)
{
$collect_to_print= array();
if ($node instanceof ArrayDimFetch
&& $node->var instanceof Variable
&& $node->var->name === '_POST')
{
$variableName = (string) $node->var->name;
$collect_to_print[$node->dim->value] = $node->var->name; // will store the variables in array in a way to print them all later such as variable => _POST , how to get the name `variable` in this case
return $node;
}
else
if ($node instanceof Variable
&& !($node->var->name === '_POST' ))
{
$collect_to_print[$node->name] = 'Empty' ;
}
}
variable =>
first => _POST // This _POST should be the value of variable (above)
new => Empty
nonexist => Empty
到目前为止,我的结果在单独的行中显示每个变量,如下所示:
public function leaveNode(Node $node)
{
$collect_to_print= array();
if ($node instanceof ArrayDimFetch
&& $node->var instanceof Variable
&& $node->var->name === '_POST')
{
$variableName = (string) $node->var->name;
$collect_to_print[$node->dim->value] = $node->var->name; // will store the variables in array in a way to print them all later such as variable => _POST , how to get the name `variable` in this case
return $node;
}
else
if ($node instanceof Variable
&& !($node->var->name === '_POST' ))
{
$collect_to_print[$node->name] = 'Empty' ;
}
}
variable =>
first => _POST // This _POST should be the value of variable (above)
new => Empty
nonexist => Empty
然而,我预计结果是:
variable => _POST
new => Empty
nonexist => Empty
请提供任何帮助这比您提出的其他问题要复杂得多,但了解如何编写它很有趣
我在代码中添加了注释,但基本上它会分析代码并查找赋值(PhpParser\Node\Expr\Assign
nodes的实例)。然后,它将其拆分为左部分和右部分,并递归地提取任一部分中的任何变量
这段代码允许在表达式的任一侧嵌套变量,我修改了示例代码以提供一些更广泛的示例
代码中的注释(假设对解析器如何处理节点等有一定的了解)
它给出了变量列表,如
Array
(
[0] => $_POST
[1] => $b
[3] => $new
[4] => $nonexist
)
表达式列表如下所示
Array
(
[$_POST[$b]] => Array
(
[to] => Array
(
[0] => $_POST
[1] => $b
)
[0] => Array
(
[0] => $_POST
)
)
[$new] => Array
(
[to] => Array
(
[0] => $new
)
[0] => Array
(
[0] => $nonexist
)
[1] => Array
(
[0] => $_POST
[1] => $b
)
)
)
请注意,数组的[to]
元素包含=
左侧涉及的任何变量。这比您所问的其他问题要复杂得多,但了解如何编写它非常有趣
我在代码中添加了注释,但基本上它会分析代码并查找赋值(PhpParser\Node\Expr\Assign
nodes的实例)。然后,它将其拆分为左部分和右部分,并递归地提取任一部分中的任何变量
这段代码允许在表达式的任一侧嵌套变量,我修改了示例代码以提供一些更广泛的示例
代码中的注释(假设对解析器如何处理节点等有一定的了解)
它给出了变量列表,如
Array
(
[0] => $_POST
[1] => $b
[3] => $new
[4] => $nonexist
)
表达式列表如下所示
Array
(
[$_POST[$b]] => Array
(
[to] => Array
(
[0] => $_POST
[1] => $b
)
[0] => Array
(
[0] => $_POST
)
)
[$new] => Array
(
[to] => Array
(
[0] => $new
)
[0] => Array
(
[0] => $nonexist
)
[1] => Array
(
[0] => $_POST
[1] => $b
)
)
)
注意,数组的<代码> [to] /代码>元素包含在“代码> >左侧>代码> >“/p>”左侧的任何变量。为什么您会期望<代码>变量> > POST < /代码>,然后不得到<代码> new = >不存在< /代码>?但是,我希望
\u POST
被视为值不分离的变量。我希望将它们存储在数组中,如$collect\u to\u print[variable]=\u POST
,$collect\u to\u print[new]=Empty
,$collect\u to\u print[nonexist]=Empty
我搜索代码中的任何变量。找到后,获取该变量的值,并将其与键索引(该变量的名称)一起存储在数组中。如果该值是另一个普通变量,则将每个变量及其值存储在数组中。但是,我想把全局变量看作上面变量的值,而不是考虑值的新变量。为什么你会期望<代码>变量> > POST < /代码>,然后不得到<代码> new = >不存在< /代码>?但是,我希望\u POST
被视为值不分离的变量。我希望将它们存储在数组中,如$collect\u to\u print[variable]=\u POST
,$collect\u to\u print[new]=Empty
,$collect\u to\u print[nonexist]=Empty
我搜索代码中的任何变量。找到后,获取该变量的值,并将其与键索引(该变量的名称)一起存储在数组中。如果该值是另一个普通变量,则将每个变量及其值存储在数组中。但是,我想把全局变量看作上面变量的值,而不是带有值的新变量。