Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A PHP parser written in PHP

License

NotificationsYou must be signed in to change notification settings

nikic/PHP-Parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,783 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Coverage Status

This is a PHP parser written in PHP. Its purpose is to simplify static code analysis andmanipulation.

Documentation for version 5.x (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.4, with limited support for parsing PHP 5.x).

Documentation for version 4.x (supported; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.3).

Features

The main features provided by this library are:

  • Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST).
    • Invalid code can be parsed into a partial AST.
    • The AST contains accurate location information.
  • Dumping the AST in human-readable form.
  • Converting an AST back to PHP code.
    • Formatting can be preserved for partially changed ASTs.
  • Infrastructure to traverse and modify ASTs.
  • Resolution of namespaced names.
  • Evaluation of constant expressions.
  • Builders to simplify AST construction for code generation.
  • Converting an AST into JSON and back.

Quick Start

Install the library usingcomposer:

php composer.phar require nikic/php-parser

Parse some PHP code into an AST and dump the result in human-readable form:

<?phpusePhpParser\Error;usePhpParser\NodeDumper;usePhpParser\ParserFactory;$code = <<<'CODE'<?phpfunction test($foo){    var_dump($foo);}CODE;$parser = (newParserFactory())->createForNewestSupportedVersion();try {$ast =$parser->parse($code);}catch (Error$error) {echo"Parse error:{$error->getMessage()}\n";return;}$dumper =newNodeDumper;echo$dumper->dump($ast) ."\n";

This dumps an AST looking something like this:

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                        )                    )                )            )        )    ))

Let's traverse the AST and perform some kind of modification. For example, drop all function bodies:

usePhpParser\Node;usePhpParser\Node\Stmt\Function_;usePhpParser\NodeTraverser;usePhpParser\NodeVisitorAbstract;$traverser =newNodeTraverser();$traverser->addVisitor(newclassextends NodeVisitorAbstract {publicfunctionenterNode(Node$node) {if ($nodeinstanceof Function_) {// Clean out the function body$node->stmts = [];        }    }});$ast =$traverser->traverse($ast);echo$dumper->dump($ast) ."\n";

This gives us an AST where theFunction_::$stmts are empty:

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(        )    ))

Finally, we can convert the new AST back to PHP code:

usePhpParser\PrettyPrinter;$prettyPrinter =newPrettyPrinter\Standard;echo$prettyPrinter->prettyPrintFile($ast);

This gives us our original code, minus thevar_dump() call inside the function:

<?phpfunctiontest($foo){}

For a more comprehensive introduction, see the documentation.

Documentation

  1. Introduction
  2. Usage of basic components

Component documentation:


[8]ページ先頭

©2009-2026 Movatter.jp