Как получить индекс глобальных переменных в PHP -Parser - PullRequest
0 голосов
/ 07 марта 2020

Я использую PHP -Parser для построения AST. Затем я хочу достичь индекса глобальных переменных, таких как $_POST['firstname'], поэтому я хочу достичь индекса firstname и получить его. Как достичь индекса глобальных переменных, например;

test

<?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 и сохранить его в переменной?

1 Ответ

1 голос
/ 07 марта 2020

Из вашего предыдущего кода в Как использовать PHP -Parser, чтобы получить имя глобальной переменной и изменить его и код, который я отправил в качестве ответа.

Как только вы определили что узел, на который вы смотрите, имеет тип 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" /

...