{"id":15038186,"url":"https://github.com/nikic/php-parser","last_synced_at":"2025-09-09T21:09:29.601Z","repository":{"id":37773872,"uuid":"1631570","full_name":"nikic/PHP-Parser","owner":"nikic","description":"A PHP parser written in PHP","archived":false,"fork":false,"pushed_at":"2025-04-29T21:19:04.000Z","size":7743,"stargazers_count":17232,"open_issues_count":52,"forks_count":1108,"subscribers_count":223,"default_branch":"master","last_synced_at":"2025-05-05T14:07:14.815Z","etag":null,"topics":["ast","parser","php","static-analysis"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nikic.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2011-04-18T17:03:47.000Z","updated_at":"2025-05-05T05:26:15.000Z","dependencies_parsed_at":"2023-09-26T22:44:37.590Z","dependency_job_id":"90250b8a-138a-474f-a32d-5f8d541086dc","html_url":"https://github.com/nikic/PHP-Parser","commit_stats":{"total_commits":1626,"total_committers":147,"mean_commits":"11.061224489795919","dds":0.498769987699877,"last_synced_commit":"954f7a411f9411b16ee08cd8ad34914e20bc3906"},"previous_names":[],"tags_count":105,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikic%2FPHP-Parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikic%2FPHP-Parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikic%2FPHP-Parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikic%2FPHP-Parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikic","download_url":"https://codeload.github.com/nikic/PHP-Parser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253763957,"owners_count":21960484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ast","parser","php","static-analysis"],"created_at":"2024-09-24T20:37:28.517Z","updated_at":"2025-05-12T15:13:53.759Z","avatar_url":"https://github.com/nikic.png","language":"PHP","readme":"PHP Parser\n==========\n\n[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)\n\nThis is a PHP parser written in PHP. Its purpose is to simplify static code analysis and\nmanipulation.\n\n[**Documentation for version 5.x**][doc_master] (current; for running on PHP \u003e= 7.4; for parsing PHP 7.0 to PHP 8.4, with limited support for parsing PHP 5.x).\n\n[Documentation for version 4.x][doc_4_x] (supported; for running on PHP \u003e= 7.0; for parsing PHP 5.2 to PHP 8.3).\n\nFeatures\n--------\n\nThe main features provided by this library are:\n\n * Parsing PHP 7, and PHP 8 code into an abstract syntax tree (AST).\n   * Invalid code can be parsed into a partial AST.\n   * The AST contains accurate location information.\n * Dumping the AST in human-readable form.\n * Converting an AST back to PHP code.\n   * Formatting can be preserved for partially changed ASTs.\n * Infrastructure to traverse and modify ASTs.\n * Resolution of namespaced names.\n * Evaluation of constant expressions.\n * Builders to simplify AST construction for code generation.\n * Converting an AST into JSON and back.\n\nQuick Start\n-----------\n\nInstall the library using [composer](https://getcomposer.org):\n\n    php composer.phar require nikic/php-parser\n\nParse some PHP code into an AST and dump the result in human-readable form:\n\n```php\n\u003c?php\nuse PhpParser\\Error;\nuse PhpParser\\NodeDumper;\nuse PhpParser\\ParserFactory;\n\n$code = \u003c\u003c\u003c'CODE'\n\u003c?php\n\nfunction test($foo)\n{\n    var_dump($foo);\n}\nCODE;\n\n$parser = (new ParserFactory())-\u003ecreateForNewestSupportedVersion();\ntry {\n    $ast = $parser-\u003eparse($code);\n} catch (Error $error) {\n    echo \"Parse error: {$error-\u003egetMessage()}\\n\";\n    return;\n}\n\n$dumper = new NodeDumper;\necho $dumper-\u003edump($ast) . \"\\n\";\n```\n\nThis dumps an AST looking something like this:\n\n```\narray(\n    0: Stmt_Function(\n        attrGroups: array(\n        )\n        byRef: false\n        name: Identifier(\n            name: test\n        )\n        params: array(\n            0: Param(\n                attrGroups: array(\n                )\n                flags: 0\n                type: null\n                byRef: false\n                variadic: false\n                var: Expr_Variable(\n                    name: foo\n                )\n                default: null\n            )\n        )\n        returnType: null\n        stmts: array(\n            0: Stmt_Expression(\n                expr: Expr_FuncCall(\n                    name: Name(\n                        name: var_dump\n                    )\n                    args: array(\n                        0: Arg(\n                            name: null\n                            value: Expr_Variable(\n                                name: foo\n                            )\n                            byRef: false\n                            unpack: false\n                        )\n                    )\n                )\n            )\n        )\n    )\n)\n```\n\nLet's traverse the AST and perform some kind of modification. For example, drop all function bodies:\n\n```php\nuse PhpParser\\Node;\nuse PhpParser\\Node\\Stmt\\Function_;\nuse PhpParser\\NodeTraverser;\nuse PhpParser\\NodeVisitorAbstract;\n\n$traverser = new NodeTraverser();\n$traverser-\u003eaddVisitor(new class extends NodeVisitorAbstract {\n    public function enterNode(Node $node) {\n        if ($node instanceof Function_) {\n            // Clean out the function body\n            $node-\u003estmts = [];\n        }\n    }\n});\n\n$ast = $traverser-\u003etraverse($ast);\necho $dumper-\u003edump($ast) . \"\\n\";\n```\n\nThis gives us an AST where the `Function_::$stmts` are empty:\n\n```\narray(\n    0: Stmt_Function(\n        attrGroups: array(\n        )\n        byRef: false\n        name: Identifier(\n            name: test\n        )\n        params: array(\n            0: Param(\n                attrGroups: array(\n                )\n                type: null\n                byRef: false\n                variadic: false\n                var: Expr_Variable(\n                    name: foo\n                )\n                default: null\n            )\n        )\n        returnType: null\n        stmts: array(\n        )\n    )\n)\n```\n\nFinally, we can convert the new AST back to PHP code:\n\n```php\nuse PhpParser\\PrettyPrinter;\n\n$prettyPrinter = new PrettyPrinter\\Standard;\necho $prettyPrinter-\u003eprettyPrintFile($ast);\n```\n\nThis gives us our original code, minus the `var_dump()` call inside the function:\n\n```php\n\u003c?php\n\nfunction test($foo)\n{\n}\n```\n\nFor a more comprehensive introduction, see the documentation.\n\nDocumentation\n-------------\n\n 1. [Introduction](doc/0_Introduction.markdown)\n 2. [Usage of basic components](doc/2_Usage_of_basic_components.markdown)\n\nComponent documentation:\n\n * [Walking the AST](doc/component/Walking_the_AST.markdown)\n   * Node visitors\n   * Modifying the AST from a visitor\n   * Short-circuiting traversals\n   * Interleaved visitors\n   * Simple node finding API\n   * Parent and sibling references\n * [Name resolution](doc/component/Name_resolution.markdown)\n   * Name resolver options\n   * Name resolution context\n * [Pretty printing](doc/component/Pretty_printing.markdown)\n   * Converting AST back to PHP code\n   * Customizing formatting\n   * Formatting-preserving code transformations\n * [AST builders](doc/component/AST_builders.markdown)\n   * Fluent builders for AST nodes\n * [Lexer](doc/component/Lexer.markdown)\n   * Emulation\n   * Tokens, positions and attributes\n * [Error handling](doc/component/Error_handling.markdown)\n   * Column information for errors\n   * Error recovery (parsing of syntactically incorrect code)\n * [Constant expression evaluation](doc/component/Constant_expression_evaluation.markdown)\n   * Evaluating constant/property/etc initializers\n   * Handling errors and unsupported expressions\n * [JSON representation](doc/component/JSON_representation.markdown)\n   * JSON encoding and decoding of ASTs\n * [Performance](doc/component/Performance.markdown)\n   * Disabling Xdebug\n   * Reusing objects\n   * Garbage collection impact\n * [Frequently asked questions](doc/component/FAQ.markdown)\n   * Parent and sibling references\n\n [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc\n [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc\n [doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikic%2Fphp-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikic%2Fphp-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikic%2Fphp-parser/lists"}