如何获取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"
/
我正在使用 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"
/