1
0
mirror of https://github.com/danog/PHP-Parser.git synced 2024-11-30 04:19:30 +01:00
Go to file
Nikita Popov 5900d78cc9 FPPP: Support anonymous classes (#432)
This is a huge hack... We temporarily create a new node with the
correct structure and use that for printing.

I think it would be better to always use a separate node type for
NewAnonClass, rather than using a combination of New and Class,
but this would require some larger changes, as this node type would
have to be both Expr and ClassLike, which is not possible right now,
as the latter is a class rather than an interface...
2017-10-29 12:26:12 +01:00
bin [cs] apply short array to bin/php-parse 2017-08-15 22:25:39 +02:00
doc docs: "return" => "remove" typo (#430) 2017-10-22 13:50:47 +02:00
grammar Merge branch '3.x' 2017-10-01 16:55:54 +02:00
lib FPPP: Support anonymous classes (#432) 2017-10-29 12:26:12 +01:00
test FPPP: Support anonymous classes (#432) 2017-10-29 12:26:12 +01:00
test_old Update run-php-src to use 7.1.0 2016-12-11 16:47:47 +01:00
.gitignore Use composer PSR-4 autoloader 2015-09-16 22:02:00 +09:00
.travis.yml travis: add dash to make command format united (#407) 2017-08-13 14:04:53 +02:00
CHANGELOG.md FPPP: Support anonymous classes (#432) 2017-10-29 12:26:12 +01:00
composer.json Bump phpunit version (#381) 2017-04-27 18:14:07 +02:00
LICENSE fix typos 2011-06-26 18:45:19 +02:00
phpunit.xml.dist Allow tests without assertions 2017-04-27 18:20:12 +02:00
README.md Add quick start to README 2017-10-18 18:43:39 +02:00
UPGRADE-1.0.md Fix typos 2014-09-12 14:44:32 +02:00
UPGRADE-2.0.md Release PHP-Parser 2.0.0 2015-12-04 16:28:43 +01:00
UPGRADE-3.0.md Add UPGRADE note about NameResolver changes 2016-12-07 20:09:23 +01:00
UPGRADE-4.0.md Update changelog 2017-09-29 17:41:19 +02:00

PHP Parser

Build Status Coverage Status

This is a PHP 5.2 to PHP 7.2 parser written in PHP. Its purpose is to simplify static code analysis and manipulation.

Documentation for version 3.x (stable; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).

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

Features

The main features provided by this library are:

  • Parsing PHP 5 and PHP 7 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.
    • Experimental: 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:

php composer.phar require nikic/php-parser

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

<?php
use PhpParser\Error;
use PhpParser\NodeDumper;
use PhpParser\ParserFactory;

$code = <<<'CODE'
<?php

function test($foo)
{
    var_dump($foo);
}
CODE;

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
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(
        byRef: false
        name: Identifier(
            name: test
        )
        params: array(
            0: Param(
                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(
                        parts: array(
                            0: var_dump
                        )
                    )
                    args: array(
                        0: Arg(
                            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:

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(
        byRef: false
        name: Identifier(
            name: test
        )
        params: array(
            0: Param(
                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:

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

function test($foo)
{
}

For a more comprehensive introduction, see the documentation.

Documentation

  1. Introduction
  2. Usage of basic components
  3. Other node tree representations
  4. Code generation
  5. Frequently asked questions

Component documentation: