如何使用nikic/PHP解析器解析和列出所有类方法

如何使用nikic/PHP解析器解析和列出所有类方法,php,lexer,Php,Lexer,读取文档时,我可以转储收集的信息,但没有迭代集合以按特定节点类型进行过滤的示例 use PhpParser\ParserFactory; use PhpParser\Error; $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7); try { $statements = $parser->parse(file_get_contents("SomeClass.php")); $method

读取文档时,我可以转储收集的信息,但没有迭代集合以按特定节点类型进行过滤的示例

use PhpParser\ParserFactory;
use PhpParser\Error;
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {
    $statements = $parser->parse(file_get_contents("SomeClass.php"));
    $methods = array_filter($statements, function($statement) {
        // some form of filtering for methods
    });
} catch (Error $exception) {
    echo "parse error ~> ", $exception->getMessage();
}
选项1-简单节点查找
使用PhpParser\{Node,NodeFinder,ParserFactory};
/**解析文件*/
$parser=(新建ParserFactory)->create(ParserFactory::preference_PHP7);
$stmts=$parser->parse(文件获取内容(“SomeClass.php”);
/**特拉弗斯*/
$nodeFinder=新的nodeFinder();
$methods=$nodeFinder->findInstanceOf($stmts,Node\Stmt\ClassMethod::class);
/**倾倒*/
var_dump($方法);
选项2-完整的“节点访问者”机制
使用PhpParser\{Node,NodeTraverser,NodeVisitorAbstract,ParserFactory};
/**过滤器定义*/
$methods=[];
$traverser=新的NodeTraverser();
$traverser->addVisitor(新类扩展了NodeVisitorAbstract{
函数enterNode(Node$Node){
if($node instanceof node\Stmt\ClassMethod){
全球方法;
$methods[]=$node;
return NodeTraverser::不遍历子节点;
}
}
});
/**解析文件*/
$parser=(新建ParserFactory)->create(ParserFactory::preference_PHP7);
$stmts=$parser->parse(文件获取内容(“SomeClass.php”);
/**使用我们的过滤器遍历*/
$traverser->traverse($stmts);
/**倾倒*/
var_dump($方法);

如果我没记错的话,应该有访客类。另请参见:使用Node\Stmt\classmethod解决了这个问题吗?你还需要它吗?这些是非常有用的代码示例,谢谢。你能解释一下你什么时候会选择每个选项吗?由于他们希望在这种情况下给@PeterB和任何徘徊于此的人提供相同的结果:在这种情况下,唯一的区别是使用
NodeTraverser::DONT_TRAVERSE\u CHILDREN
,这样你就可以跳过在不可能的位置搜索节点。例如,如果您不关心匿名类,您将不会在另一个类中看到命名类,因此可以跳过整个类节点。发动机罩下的
NodeFinder
也使用
NodeTraverser