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 &&

我正在使用查找PHP程序的AST。例如:

代码

我试图找到的是
变量=\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
我搜索代码中的任何变量。找到后,获取该变量的值,并将其与键索引(该变量的名称)一起存储在数组中。如果该值是另一个普通变量,则将每个变量及其值存储在数组中。但是,我想把全局变量看作上面变量的值,而不是带有值的新变量。