Это 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 и обратно.
Установите библиотеку с помощью композитора:
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 $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(новый класс расширяет NodeVisitorAbstract {public function enterNode(Node $node) {if ($node instanceof Function_) {// Очистить функцию body$node->stmts = []; } } });$ast = $traverser->traverse($ast);echo $dumper->dump($ast) . «н»;
Это дает нам AST, в котором Function_::$stmts
пусты:
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 test($foo) { }
Более подробное введение см. в документации.
Введение
Использование основных компонентов
Документация компонента:
Прогулка по АСТ
Посетители узла
Изменение AST от посетителя
Короткие обходы
Чередование посетителей
Простой API поиска узлов
Рекомендации родителей и братьев и сестер
Разрешение имени
Параметры преобразователя имен
Контекст разрешения имени
Красивая печать
Преобразование AST обратно в код PHP
Настройка форматирования
Преобразования кода с сохранением форматирования
строители АСТ
Свободные сборщики узлов AST
Лексер
Эмуляция
Токены, позиции и атрибуты
Обработка ошибок
Столбец с информацией об ошибках
Восстановление ошибок (парсинг синтаксически некорректного кода)
Оценка постоянного выражения
Оценка инициализаторов констант/свойств/и т.д.
Обработка ошибок и неподдерживаемых выражений
JSON-представление
Кодирование JSON и декодирование AST
Производительность
Отключение Xdebug
Повторное использование объектов
Влияние сбора мусора
Часто задаваемые вопросы
Рекомендации родителей и братьев и сестер