Dies ist ein in PHP geschriebener PHP-Parser. Sein Zweck besteht darin, die statische Codeanalyse und -manipulation zu vereinfachen.
Dokumentation für Version 5.x (aktuell; für die Ausführung auf PHP >= 7.4; für das Parsen von PHP 7.0 bis PHP 8.4, mit eingeschränkter Unterstützung für das Parsen von PHP 5.x).
Dokumentation für Version 4.x (unterstützt; für die Ausführung auf PHP >= 7.0; für das Parsen von PHP 5.2 bis PHP 8.3).
Die Hauptfunktionen dieser Bibliothek sind:
Parsen von PHP 7- und PHP 8-Code in einen abstrakten Syntaxbaum (AST).
Ungültiger Code kann in einen Teil-AST geparst werden.
Der AST enthält genaue Standortinformationen.
Den AST in für Menschen lesbarer Form ausgeben.
Konvertieren eines AST zurück in PHP-Code.
Die Formatierung kann für teilweise geänderte ASTs beibehalten werden.
Infrastruktur zum Durchqueren und Ändern von ASTs.
Auflösung von Namespace-Namen.
Auswertung konstanter Ausdrücke.
Builder zur Vereinfachung der AST-Konstruktion für die Codegenerierung.
Konvertieren eines AST in JSON und zurück.
Installieren Sie die Bibliothek mit Composer:
php composer.phar require nikic/php-parser
Parsen Sie etwas PHP-Code in einen AST und geben Sie das Ergebnis in für Menschen lesbarer Form aus:
<?phpuse PhpParserError;use PhpParserNodeDumper;use PhpParserParserFactory;$code = <<<'CODE'<?phpfunction test($foo){ var_dump($foo);}CODE;$parser = (new ParserFactory())->createForNewestSupportedVersion ();try {$ast = $parser->parse($code); } Catch (Error $error) {echo "Parse error: {$error->getMessage()}n";return; }$dumper = new NodeDumper;echo $dumper->dump($ast) . "N";
Dadurch wird ein AST ausgegeben, der etwa so aussieht:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) flags: 0 type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( 0: Stmt_Expression( expr: Expr_FuncCall( name: Name( name: var_dump ) args: array( 0: Arg( name: null value: Expr_Variable( name: foo ) byRef: false unpack: false ) ) ) ) ) ) )
Lassen Sie uns den AST durchlaufen und eine Änderung vornehmen. Löschen Sie beispielsweise alle Funktionskörper:
use PhpParserNode;use PhpParserNodeStmtFunction_;use PhpParserNodeTraverser;use PhpParserNodeVisitorAbstract;$traverser = new NodeTraverser();$traverser->addVisitor(new class erweitert NodeVisitorAbstract {public function enterNode(Node $node) {if ($node exampleof Function_) {// Bereinigen Sie die Funktion body$node->stmts = []; } } });$ast = $traverser->traverse($ast);echo $dumper->dump($ast) . "N";
Dies gibt uns einen AST, bei dem Function_::$stmts
leer sind:
array( 0: Stmt_Function( attrGroups: array( ) byRef: false name: Identifier( name: test ) params: array( 0: Param( attrGroups: array( ) type: null byRef: false variadic: false var: Expr_Variable( name: foo ) default: null ) ) returnType: null stmts: array( ) ) )
Schließlich können wir den neuen AST wieder in PHP-Code konvertieren:
use PhpParserPrettyPrinter;$prettyPrinter = new PrettyPrinterStandard;echo $prettyPrinter->prettyPrintFile($ast);
Dies ergibt unseren ursprünglichen Code, abzüglich des var_dump()
-Aufrufs innerhalb der Funktion:
<?phpfunction test($foo) { }
Eine umfassendere Einführung finden Sie in der Dokumentation.
Einführung
Verwendung grundlegender Komponenten
Komponentendokumentation:
Den AST laufen
Knotenbesucher
Ändern des AST von einem Besucher
Kurzschlussdurchquerungen
Verschachtelte Besucher
Einfache Knotenfindungs-API
Referenzen von Eltern und Geschwistern
Namensauflösung
Optionen zur Namensauflösung
Kontext der Namensauflösung
Hübscher Druck
Konvertieren von AST zurück in PHP-Code
Anpassen der Formatierung
Formatierungserhaltende Codetransformationen
AST-Builder
Fließende Builder für AST-Knoten
Lexer
Emulation
Token, Positionen und Attribute
Fehlerbehandlung
Spalteninformationen für Fehler
Fehlerbeseitigung (Analyse von syntaktisch fehlerhaftem Code)
Auswertung konstanter Ausdrücke
Auswerten von Konstanten-/Eigenschafts-/usw.-Initialisierern
Umgang mit Fehlern und nicht unterstützten Ausdrücken
JSON-Darstellung
JSON-Kodierung und Dekodierung von ASTs
Leistung
Deaktivieren von Xdebug
Wiederverwendung von Objekten
Auswirkungen der Garbage Collection
Häufig gestellte Fragen
Referenzen von Eltern und Geschwistern