首頁 >後端開發 >PHP問題 >php parser怎麼用

php parser怎麼用

WBOY
WBOY原創
2022-07-26 15:58:582220瀏覽

「php parser」用於產生範本程式碼,或使用其產生的抽象語法樹進行靜態分析;「php parser」是有nikic開發的一款PHP抽象語法樹解析工具,同時兼顧介面易用,結構簡介,工具鏈完善等諸多優點。

php parser怎麼用

本文操作環境: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 &#39;Hi&#39;, &#39;World&#39;;

解析後產生的樹狀結構如下:

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 (PhpParser 0 (PhpParumber) 和Magcalc​​an (Php), 0 (PhpParser (PcalarLN) 和合規性 (Php), 0 (PhpParser (PcalarLN) ) 等。它們也算是表達式,所有都繼承自表達式節點;

其他節點,例如:名稱節點(PhpParserNodeName) 和參數節點(PhpParserNodeArg)

凡是節點類別名稱與PHP 關鍵字有衝突的,該節點的類別名稱都統一以_ 結尾,如PhpParserNodeScalarString_。

PHP Parser 能做什麼?

除了單純的將原始碼解析成抽象語法樹以外,它還附帶了以下特性:

程式碼生成,可以將抽象語法樹轉換成PHP 程式碼

抽象語法樹與XML 的相互轉換

導出便於查看的語法樹結構

遍歷與修改語法樹結構的基類(節點遍歷者traverser 和節點訪問者visitor)

支援命名空間的節點訪客

利用語法樹的遍歷,我們能夠寫程式分析程式碼問題。結合程式碼產生和語法樹結構的遍歷修改等特性,我們可以自動化程式碼重構等等。

推薦學習:《PHP影片教學

以上是php parser怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn