您好,登錄后才能下訂單哦!
這篇文章主要介紹“php parser如何用”,在日常操作中,相信很多人在php parser如何用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”php parser如何用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
“php parser”用于生成模板代碼,或者使用其生成的抽象語法樹進行靜態(tài)分析;“php parser”是有nikic開發(fā)的一款PHP抽象語法樹解析工具,同時兼顧接口易用,結構簡介,工具鏈完善等諸多優(yōu)點。
本文操作環(huán)境:Windows10系統(tǒng)、PHP8.1版、Dell G3電腦
PHP Parser是由 nikic 開發(fā)的一款php抽象語法樹(AST)解析工具。PHP Parser同時兼顧接口易用,結構簡潔,工具鏈完善等諸多優(yōu)點。在工程上,普遍使用PHP Paser生成模板代碼,或使用其生成的抽象語法樹進行靜態(tài)分析。
PHP Parser 是一個用于源代碼解析的項目,值得一提的是它使用純 PHP 編寫,對于 PHP 程序員來說,能使用自己熟悉的語言來做靜態(tài)分析等源碼處理,無疑是一大便利。
PHP 是動態(tài)語言,性能不高,所以用 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 對語言節(jié)點(Node)進行分組:
PhpParserNodeStmt 是語句(statement)節(jié)點,包括無返回值和不會出現在表達式的語言結構,例如類的定義;
PhpParserNodeExpr 是表達式(expression)節(jié)點,包括有返回值和能出現在表達式的語言結構,例如 $var (PhpParserNodeExprVariable) 和 func() (PhpParserNodeExprFuncCall) 等;
PhpParserNodeScalar 標量(Scalar)節(jié)點,比如:'string' (PhpParserNodeScalarString_), 0 (PhpParserNodeScalarLNumber) 和魔術常量如 __FILE__ (PhpParserNodeScalarMagicConstFile) 等。它們也算是表達式,所有都繼承自表達式節(jié)點;
其他節(jié)點,例如:名稱節(jié)點 (PhpParserNodeName) 和參數節(jié)點 (PhpParserNodeArg)
凡是節(jié)點類名與 PHP 關鍵字有沖突的,該節(jié)點的類名都統(tǒng)一以 _ 結尾,如 PhpParserNodeScalarString_。
PHP Parser 能做什么?
除了單純的將源代碼解析成抽象語法樹以外,它還附帶了以下特性:
代碼生成,可以將抽象語法樹轉換成 PHP 代碼
抽象語法樹與 XML 的相互轉換
導出便于查看的語法樹結構
遍歷與修改語法樹結構的基類(節(jié)點遍歷者traverser 和 節(jié)點訪問者 visitor)
支持命名空間的節(jié)點訪問者
利用語法樹的遍歷,我們能夠寫程序分析代碼問題。結合代碼生成和語法樹結構的遍歷修改等特性,我們可以自動化代碼重構等等。
到此,關于“php parser如何用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。