Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nikic/PHP-Parser
A PHP parser written in PHP
https://github.com/nikic/PHP-Parser
ast parser php static-analysis
Last synced: about 2 months ago
JSON representation
A PHP parser written in PHP
- Host: GitHub
- URL: https://github.com/nikic/PHP-Parser
- Owner: nikic
- License: bsd-3-clause
- Created: 2011-04-18T17:03:47.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2024-05-14T21:29:30.000Z (7 months ago)
- Last Synced: 2024-05-18T11:42:23.158Z (7 months ago)
- Topics: ast, parser, php, static-analysis
- Language: PHP
- Homepage:
- Size: 7.24 MB
- Stars: 16,850
- Watchers: 233
- Forks: 1,083
- Open Issues: 42
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
- awesome-php - PHP Parser - A PHP parser written in PHP. (Table of Contents / Code Analysis)
- awesome-php-cn - PHP Parser - 用PHP编写的一个PHP解析器. (目录 / 代码分析 Code Analysis)
- awesome-projects - PHP Parser - A PHP parser written in PHP. (PHP / Code Analysis)
- php-awesome - PHP-Parser - PHP 语法解析器 (类库 / 语法解析)
- awesome-php - PHP Parser - A PHP parser written in PHP. (Table of Contents / Code Analysis)
- awesome-hacking-lists - nikic/PHP-Parser - A PHP parser written in PHP (PHP)
- StarryDivineSky - nikic/PHP-Parser
README
PHP Parser
==========[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)
This is a PHP parser written in PHP. Its purpose is to simplify static code analysis and
manipulation.[**Documentation for version 5.x**][doc_master] (current; for running on PHP >= 7.4; for parsing PHP 7.0 to PHP 8.3, with limited support for parsing PHP 5.x).
[Documentation for version 4.x][doc_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 using [composer](https://getcomposer.org):
php composer.phar require nikic/php-parser
Parse some PHP code into an AST and dump the result in human-readable form:
```php
createForNewestSupportedVersion();
try {
$ast = $parser->parse($code);
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}\n";
return;
}$dumper = new NodeDumper;
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:
```php
use PhpParser\Node;
use PhpParser\Node\Stmt\Function_;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;$traverser = new NodeTraverser();
$traverser->addVisitor(new class extends NodeVisitorAbstract {
public function enterNode(Node $node) {
if ($node instanceof Function_) {
// Clean out the function body
$node->stmts = [];
}
}
});$ast = $traverser->traverse($ast);
echo $dumper->dump($ast) . "\n";
```This gives us an AST where the `Function_::$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:
```php
use PhpParser\PrettyPrinter;$prettyPrinter = new PrettyPrinter\Standard;
echo $prettyPrinter->prettyPrintFile($ast);
```This gives us our original code, minus the `var_dump()` call inside the function:
```php