如何遍历具有If条件的PHP源代码



我正在使用PHP Parser来评估用于遍历if语句的条件。我只想知道在遍历代码的过程中使用了什么条件。例如:

测试

<?php 
$val = true;
if ($val == true){
$result = true;
} else {
$result  = false;
}

我已经找到了测试代码的AST,如下所示

AST

array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: val ) expr: Expr_ConstFetch( name: Name( parts: array( 0: true ) ) ) ) ) 1: Stmt_If( cond: Expr_BinaryOp_Equal( left: Expr_Variable( name: val ) right: Expr_ConstFetch( name: Name( parts: array( 0: true ) ) ) ) stmts: array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: result ) expr: Expr_ConstFetch( name: Name( parts: array( 0: true ) ) ) ) ) ) elseifs: array( ) else: Stmt_Else( stmts: array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: result ) expr: Expr_ConstFetch( name: Name( parts: array( 0: false ) ) ) ) ) ) ) ) )

我试图得到的是遍历过程中测试代码中使用的条件,预计是这样的:

预期结果

Conditions: (operator: Equal true:bool,true:bool,)
// OR 
Condition: (operator: NOT (operator: Equal true:bool,true:bool,),)

所以我只是想知道如何获得穿越过程中通过的条件。

我要说的一件事是,您不一定能获得两个运算符的值,因为这是在运行时完成的,而不是解析。所以不是

Conditions: (operator: Equal true:bool,true:bool,)

你可以得到这样的东西。。。

Conditions: (operator: Equal left -> $val, right -> true,)

这是基于之前在"如何使用PHP Parser获取全局变量名称并更改它"中的一个问题/答案

所以目前的代码是…

$code = <<<'CODE'
<?php 
$val = true;
if ($val == true){
$result = true;
} else {
$result  = false;
}
CODE;

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {
$ast = $parser->parse($code);
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}n";
return;
}
$traverser = new NodeTraverser;
$traverser->addVisitor(new class extends NodeVisitorAbstract {
public function leaveNode(Node $node){
if ($node instanceof PhpParserNodeStmtIf_ ) {
$prettyPrinter = new PhpParserPrettyPrinterStandard;
echo "left=".$prettyPrinter->prettyPrintExpr($node->cond->left).
" ".get_class($node->cond).
" right=".$prettyPrinter->prettyPrintExpr($node->cond->right).PHP_EOL;
echo "expression is `".$prettyPrinter->prettyPrintExpr($node->cond)."`".PHP_EOL;
}
}
});
$traverser->traverse($ast);

这将给予。。。

left=$val PhpParserNodeExprBinaryOpEqual right=true
expression is `$val == true`

相关内容

  • 没有找到相关文章

最新更新