0

我正在使用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并将其存储在变量中呢?

4

1 回答 1

1

从您之前在如何使用 PHP-Parser 中获取全局变量名称并更改它的代码以及我发布的代码作为答案。

一旦您确定您正在查看的节点是 type 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"/

于 2020-03-07T07:08:13.073 回答