首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用nikic/PHP-Parser解析和列出所有类方法

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

Stack Overflow用户
提问于 2016-08-03 23:38:40
回答 1查看 1.1K关注 0票数 4

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

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-23 03:39:10

选项1-简单的节点查找

代码语言:javascript
复制
use PhpParser\{Node, NodeFinder, ParserFactory};

/** Parse file. */
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$stmts  = $parser->parse(file_get_contents("SomeClass.php"));

/** Traverse. */
$nodeFinder = new NodeFinder();
$methods = $nodeFinder->findInstanceOf($stmts, Node\Stmt\ClassMethod::class);

/** Dump. */
var_dump($methods);

选项2--完整的“节点访问者”机制

代码语言:javascript
复制
use PhpParser\{Node, NodeTraverser, NodeVisitorAbstract, ParserFactory};

/** Filter definition. */
$methods   = [];
$traverser = new NodeTraverser();
$traverser->addVisitor(new class extends NodeVisitorAbstract {
    function enterNode(Node $node) {
        if ($node instanceof Node\Stmt\ClassMethod) {
            global $methods;
            $methods[] = $node;
            return NodeTraverser::DONT_TRAVERSE_CHILDREN;
        }
    }
});

/** Parse file. */
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$stmts  = $parser->parse(file_get_contents("SomeClass.php"));

/** Traverse using our filter. */
$traverser->traverse($stmts);

/** Dump. */
var_dump( $methods );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38748078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档