• 技术文章 >后端开发 >PHP问题

    php parser怎么用

    长期闲置长期闲置2022-07-26 15:58:58原创371

    “php parser”用于生成模板代码,或者使用其生成的抽象语法树进行静态分析;“php parser”是有nikic开发的一款PHP抽象语法树解析工具,同时兼顾接口易用,结构简介,工具链完善等诸多优点。

    本文操作环境:Windows10系统、PHP8.1版、Dell G3电脑

    php parser怎么用

    PHP Parser是由 nikic 开发的一款php抽象语法树(AST)解析工具。PHP Parser同时兼顾接口易用,结构简洁,工具链完善等诸多优点。在工程上,普遍使用PHP Paser生成模板代码,或使用其生成的抽象语法树进行静态分析。

    PHP Parser 是一个用于源代码解析的项目,值得一提的是它使用纯 PHP 编写,对于 PHP 程序员来说,能使用自己熟悉的语言来做静态分析等源码处理,无疑是一大便利。

    PHP 是动态语言,性能不高,所以用 PHP Parser 分析 PHP 代码,性能也比较差。幸好代码分析这种场景,一般对性能要求也不高。

    PHP 自带的 token_get_all 函数使用 Zend 引擎的语法分析器将源码切分成一连串的 token,虽然使用这些 token 可以完成很多代码分析及处理的任务,不过由于 token 的结构太原始,遍历和操作都十分不方便。同样是基于 token_get_all 分析的结果,著名的代码标准化工具 PHP CodeSniffer 就是在对 token 作了很多处理并提供了一系列查找和遍历的接口的前提下,才让代码分析变得简便了些。

    PHP Parser 可以生成 PHP 代码对应的抽象语法树(AST,即 Abstract Syntax Tree)结构,极大地简化源代码的遍历等操作。

    PHP parser 的解析结果示例

    对于以下一段 PHP 代码:

    <?php
    echo 'Hi', 'World';

    解析后生成的树结构如下:

    array(
        0: Stmt_Echo(
            exprs: array(
                0: Scalar_String(
                    value: Hi
                )
                1: Scalar_String(
                    value: World
                )
            )
        )
    )

    PHP parser 生成的语法树的结构

    为了进一步简化操作,PHP Parser 对语言节点(Node)进行分组:

    PhpParserNodeStmt 是语句(statement)节点,包括无返回值和不会出现在表达式的语言结构,例如类的定义;

    PhpParserNodeExpr 是表达式(expression)节点,包括有返回值和能出现在表达式的语言结构,例如 $var (PhpParserNodeExprVariable) 和 func() (PhpParserNodeExprFuncCall) 等;

    PhpParserNodeScalar 标量(Scalar)节点,比如:'string' (PhpParserNodeScalarString_), 0 (PhpParserNodeScalarLNumber) 和魔术常量如 __FILE__ (PhpParserNodeScalarMagicConstFile) 等。它们也算是表达式,所有都继承自表达式节点;

    其他节点,例如:名称节点 (PhpParserNodeName) 和参数节点 (PhpParserNodeArg)

    凡是节点类名与 PHP 关键字有冲突的,该节点的类名都统一以 _ 结尾,如 PhpParserNodeScalarString_。

    PHP Parser 能做什么?

    除了单纯的将源代码解析成抽象语法树以外,它还附带了以下特性:

    代码生成,可以将抽象语法树转换成 PHP 代码

    抽象语法树与 XML 的相互转换

    导出便于查看的语法树结构

    遍历与修改语法树结构的基类(节点遍历者traverser 和 节点访问者 visitor)

    支持命名空间的节点访问者

    利用语法树的遍历,我们能够写程序分析代码问题。结合代码生成和语法树结构的遍历修改等特性,我们可以自动化代码重构等等。

    推荐学习:《PHP视频教程

    以上就是php parser怎么用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php
    上一篇:php中二维数组怎么去掉key(键名) 下一篇:php中两个数组怎么去除重复值
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• php怎么合并两个数组并从小到大排序• php怎么求数组第一个元素的下标是什么• php怎么检测数组中是否包含某字符串• php怎么求二维数组的长度• php只有索引数组对不对
    1/1

    PHP中文网