これは、PHP で書かれた PHP パーサーです。その目的は、静的コードの分析と操作を簡素化することです。
バージョン 5.x のドキュメント(最新、PHP 7.4 以上で実行用、PHP 7.0 から PHP 8.4 までの解析用、PHP 5.x の解析のサポートは限定的)。
バージョン 4.x のドキュメント (サポートされています。PHP 7.0 以上での実行用。PHP 5.2 から PHP 8.3 の解析用)。
このライブラリが提供する主な機能は次のとおりです。
PHP 7 および PHP 8 コードを解析して抽象構文ツリー (AST) にします。
無効なコードは部分的な AST に解析される可能性があります。
AST には正確な位置情報が含まれています。
AST を人間が読める形式でダンプします。
AST を PHP コードに変換します。
部分的に変更された AST の書式設定を保持できます。
AST を走査して変更するためのインフラストラクチャ。
名前空間名の解決。
定数式の評価。
コード生成のための AST 構築を簡素化するビルダー。
AST を JSON に変換したり、その逆を行ったりします。
Composer を使用してライブラリをインストールします。
php composer.phar require nikic/php-parser
一部の PHP コードを AST に解析し、結果を人間が読める形式でダンプします。
<?phpuse PhpParserError;use PhpParserNodeDumper;use PhpParserParserFactory;$code = <<<'CODE'<?phpfunction test($foo){ var_dump($foo);}CODE;$parser = (new ParserFactory())->createForNewestSupportedVersion (); {$ast = $parser->parse($code); を試してください。 } catch (エラー $error) {echo "解析エラー: {$error->getMessage()}n";return; }$dumper = 新しい NodeDumper;echo $dumper->dump($ast) 。 「ん」;
これにより、次のような AST がダンプされます。
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 ) ) ) ) ) ) )
AST を調べて、何らかの変更を実行してみましょう。たとえば、すべての関数本体を削除します。
PhpParserNode を使用; PhpParserNodeStmtFunction_ を使用; PhpParserNodeTraverser を使用; PhpParserNodeVisitorAbstract を使用;$traverser = new NodeTraverser();$traverser->addVisitor(new class extends NodeVisitorAbstract {public function enterNode(Node $node) {if ($nodeinstanceof Function_) {//クリーン関数 body$node->stmts = []; を出力します。 } } });$ast = $traverser->traverse($ast);echo $dumper->dump($ast) 。 「ん」;
これにより、 Function_::$stmts
が空の AST が得られます。
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( ) ) )
最後に、新しい AST を PHP コードに変換し直すことができます。
PhpParserPrettyPrinter を使用します;$prettyPrinter = new PrettyPrinterStandard;echo $prettyPrinter->prettyPrintFile($ast);
これにより、関数内のvar_dump()
呼び出しを除いた、元のコードが得られます。
<?phpfunction テスト($foo) { }
より包括的な概要については、ドキュメントを参照してください。
導入
基本コンポーネントの使用法
コンポーネントのドキュメント:
ASTを歩く
ノード訪問者
訪問者からの AST の変更
短絡トラバーサル
インターリーブされた訪問者
シンプルなノード検索API
親と兄弟の参照
名前解決
ネームリゾルバーのオプション
名前解決コンテキスト
きれいな印刷
AST を PHP コードに変換し直す
書式設定のカスタマイズ
書式を保持したコード変換
ASTビルダー
AST ノード用の Fluent ビルダー
レクサー
エミュレーション
トークン、ポジション、属性
エラー処理
エラーの列情報
エラー回復 (構文的に正しくないコードの解析)
定数式の評価
定数/プロパティ/その他の初期化子の評価
エラーとサポートされていない式の処理
JSON表現
AST の JSON エンコードとデコード
パフォーマンス
Xdebug の無効化
オブジェクトの再利用
ガベージ コレクションの影響
よくある質問
親と兄弟の参照