如何获取PHP-Parser中全局变量的索引

How to get the index of global variables in PHP-Parser

我正在使用 PHP-Parser 构建 AST。然后我想到达 $_POST['firstname'] 等全局变量的索引,所以我想到达索引 firstname 并获取它。例如,如何到达全局变量的索引;

测试

<?php 

$nameValue = $_POST['firstname'];
?>

AST 结果:

array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: nameValue ) expr: Expr_ArrayDimFetch( var: Expr_Variable( name: _POST ) dim: Scalar_String( value: firstname ) ) ) ) )

那么如何到达索引 firstname 并将其存储在变量中呢?

来自您之前在 中的代码和我作为答案发布的代码。

一旦你确定你正在查看的节点是类型ArrayDimFetch,并且变量名是你感兴趣的(比如这段代码中的_POST),那么你就可以输出dim节点(我假设的维度)值...

$traverser->addVisitor(new class extends NodeVisitorAbstract {
    public function leaveNode(Node $node) {
        if ($node instanceof Node\Expr\ArrayDimFetch
            && $node->var instanceof Node\Expr\Variable
            && $node->var->name === '_POST'
            ) {
                echo $node->dim->value;
            }
    }

});

更新:

经过更多调查后,上面的内容相当严格,因为它假定索引是文字。为了使其更加灵活,您可以使用漂亮打印机中的功能来代替节点的输出。所以

echo $node->dim->value;

可以替换为

$prettyPrinter = new PhpParser\PrettyPrinter\Standard;
echo $prettyPrinter->prettyPrintExpr($node->dim);

因此,如果您的代码中包含 $_POST['a'."b"],这将正确输出 'a' . "b"/