1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-PHP-Parser

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

PHP Parser

Coverage Status

Это парсер 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 и обратно.

Быстрый старт

Установите библиотеку с помощью composer:

php composer.phar require nikic/php-parser

Парсинг некоторого кода PHP в AST и вывод результата в человекочитаемом формате:

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

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

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

$parser = (new ParserFactory())->createForNewestSupportedVersion();
try {
    $ast = $parser->parse($code);
} catch (Error $error) {
    echo "Ошибка парсинга: {$error->getMessage()}\n";
    return;
}

$dumper = new NodeDumper;
echo $dumper->dump($ast) . "\n";

Это выводит 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 и выполним какое-либо изменение. Например, удалим все тела функций:

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_) {
            // Очистка тела функции
            $node->stmts = [];
        }
    }
});

$ast = $traverser->traverse($ast);
echo $dumper->dump($ast) . "\n";

Это дает нам 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:

use PhpParser\PrettyPrinter;

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

Это дает нам наш исходный код, за исключением вызова var_dump() внутри функции:

<?php

function test($foo)
{
}

Для более подробного введения см. документацию.

Документация

  1. Введение
  2. Использование базовых компонентов

Документация по компонентам:

  • Обход AST
    • Обработчики узлов
    • Модификация AST из обработчика
    • Прерывание обхода
    • Вложенные обработчики
    • Простой API для поиска узлов
    • Ссылки на родительские и соседние узлы
  • Разрешение имен
    • Опции разрешения имен
    • Контекст разрешения имен
  • Красивый вывод
    • Преобразование AST обратно в код PHP
    • Настройка форматирования
    • Форматирующие преобразования кода
  • Конструкторы AST
    • Плавающие конструкторы для узлов AST
  • Лексер
    • Эмуляция
    • Токены, позиции и атрибуты
  • Обработка ошибок
    • Информация о столбцах для ошибок
    • Восстановление после ошибок (парсинг синтаксически неверного кода)
  • Вычисление константных выражений
    • Вычисление инициализаторов констант/свойств/и т.д.
    • Обработка ошибок и неподдерживаемых выражений
  • JSON-представление
    • Кодирование и декодирование AST в JSON
  • Производительность
    • Отключение Xdebug
    • Переиспользование объектов
    • Влияние сборки мусора
  • Часто задаваемые вопросы
    • Ссылки на родительские и соседние узлы

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

PHP-Parser — это PHP-библиотека, реализующая PHP-解析器(поддерживает PHP 5.4 и более ранние версии),该项目的目的是简化静态代码分析和操作. Теперь текст корректно переведен и соответствует оригинальному тексту. Развернуть Свернуть
BSD-3-Clause
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-PHP-Parser.git
git@api.gitlife.ru:oschina-mirror/mirrors-PHP-Parser.git
oschina-mirror
mirrors-PHP-Parser
mirrors-PHP-Parser
master