Генератор кода PHP
- Поддерживает все новейшие возможности PHP (такие как крючки свойств, перечисления, атрибуты и т.д.).
- Позволяет легко модифицировать существующие классы
- Выходные данные соответствуют стилю кодирования PSR-12 / PER
- Зрелая, стабильная и широко используемая библиотека
Установка
Загрузите и установите пакет с помощью Composer:
Совместимость с PHP см. в таблице.
Классы
Начнём с простого примера генерации класса с использованием ClassType:
Это приведет к следующему результату:
Мы также можем использовать класс Printer
для генерации кода,
который, в отличие от echo $class
, мы сможем дополнительно настроить:
Можно добавлять константы (Constant) и свойства (Property):
Он генерирует:
И мы можем добавить методы:
Это приводит к:
Продвигаемые параметры, введенные в PHP 8.0, могут быть переданы в конструктор:
Это приводит к:
Свойства и классы, доступные для чтения, могут быть помечены с
помощью setReadOnly()
.
Если добавляемое свойство, константа, метод или параметр уже существуют, это вызовет исключение.
Члены можно удалить с помощью removeProperty()
, removeConstant()
,
removeMethod()
или removeParameter()
.
Вы также можете добавить существующие объекты Method
,
Property
или Constant
в класс:
Вы можете клонировать существующие методы, свойства и константы с
другим именем, используя cloneWithName()
:
Интерфейс или трейты
Вы можете создавать интерфейсы и трейты (классы InterfaceType и TraitType):
Использование признаков:
Результат:
Энумы
Вы можете легко создавать перечисления, которые появились в PHP 8.1 (класс EnumType):
Результат:
Вы также можете определить скалярные эквиваленты для случаев, чтобы создать подкрепленное перечисление:
Можно добавить комментарий или атрибуты к каждому
случаю, используя addComment()
или addAttribute()
.
Анонимные классы
Передайте null
в качестве имени, и у вас будет
анонимный класс:
Результат:
Глобальные функции
За генерацию кода обычных функций отвечает класс GlobalFunction:
Результат:
Замыкания
Класс Closure поможет вам сгенерировать код замыканий:
Результат:
Стрелочные функции
Вы также можете генерировать стрелочные функции:
Результат:
Подпись метода и функции
Методы представлены классом Method. Вы можете установить видимость, возвращаемое значение, добавить комментарии, атрибуты и т.д:
Каждый параметр представлен классом Parameter. Опять же, вы можете установить все возможные свойства:
Для определения так называемых вариативных параметров (а также
операторов splat, spread, ellipsis, unpacking или three dots) используйте setVariadic()
:
Generates:
Метод и тело функции
Содержимое функции или метода может быть передано методу
setBody()
сразу или последовательно (строка за строкой) путем
многократного вызова addBody()
:
Результат:
Для удобного внедрения переменных можно использовать специальные заполнители.
Простой заполнитель ?
Результат:
Вариативный заполнитель ...?
Результат:
Вы также можете использовать именованные параметры PHP 8 с помощью
заполнителя ...?:
Экранируйте заполнители с помощью косой черты: \?
Результат:
Принтеры и соответствие PSR
Класс Printer используется для генерации PHP-кода:
Он может генерировать код для всех остальных элементов, предлагая
такие методы, как printFunction()
, printNamespace()
и т.д.
Кроме того, доступен класс PsrPrinter
, вывод которого
соответствует стилю кодирования PSR-2 / PSR-12 / PER:
Нужно точно настроить поведение под свои нужды? Создайте свой
собственный принтер, унаследовав его от класса Printer
. Вы можете
изменить конфигурацию этих переменных:
Чем и почему отличаются стандартные Printer
и PsrPrinter
?
Почему в пакете нет только одного принтера – PsrPrinter
?
Стандарт Printer
форматирует код так, как мы это делаем во всей
Nette. Так как Nette был создан намного раньше, чем PSR, а также потому, что PSR в
течение многих лет не поставлял стандарты вовремя, а иногда даже с
задержкой в несколько лет от введения новой функции в PHP, это привело к
нескольким незначительным различиям в стандарте кодирования. Более
существенным отличием является использование табуляции вместо
пробелов. Мы знаем, что использование табуляции в наших проектах
позволяет регулировать ширину текста, что очень важно для людей с
нарушениями зрения. Примером незначительного отличия является
размещение фигурной скобки на отдельной строке для функций и методов и
всегда. Мы считаем рекомендацию PSR нелогичной и ведущей к снижению ясности
кода.
Типы
Каждый тип или тип объединения/пересечения может быть передан как строка. Вы также можете использовать предопределенные константы для собственных типов:
То же самое относится и к методу setReturnType()
.
Литералы
С помощью Literal
вы можете передавать произвольный PHP-код,
например, значения свойств или параметров по умолчанию и т. д:
Результат:
Вы также можете передавать параметры в Literal
и форматировать их
в правильный PHP-код с помощью специальных
заполнителей:
Литерал, представляющий создание нового объекта, легко генерируется
методом new
:
Атрибуты
Вы можете добавлять атрибуты PHP 8 ко всем классам, методам, свойствам, константам, перечислениям, функциям, замыканиям и параметрам. Литералы также можно использовать в качестве значений параметров.
Результат:
Крючки для недвижимости
Вы также можете определить крючки свойств (представленные классом PropertyHook) для операций get и set. Эта возможность появилась в PHP 8.4:
Это генерирует:
Свойства и крючки свойств могут быть абстрактными или конечными:
Асимметричная видимость
В PHP 8.4 появилась асимметричная видимость свойств. Вы можете установить разные уровни доступа для чтения и записи.
Видимость можно установить либо с помощью метода setVisibility()
с
двумя параметрами, либо с помощью setPublic()
, setProtected()
, или
setPrivate()
с параметром mode
, который указывает, применяется
ли видимость к получению или установке свойства. По умолчанию
используется метод 'get'
.
При этом генерируются:
Пространство имен
Классы, черты, интерфейсы и перечисления (далее классы) могут быть сгруппированы в пространства имен (PhpNamespace):
Если класс уже существует, он будет перезаписан.
Вы можете добавлять используемые с помощью конструкции use
классы, трейты и функции:
Чтобы упростить полное имя класса, функции или константы в
соответствии с определенными псевдонимами, используйте метод
simplifyName
:
И наоборот, вы можете преобразовать упрощенное имя класса, функции
или константы в полное имя, используя метод resolveName
:
Разрешение имён классов
Когда класс является частью пространства имен, он отображается несколько иначе: все типы (например, подсказки типов, возвращаемые типы, имя родительского класса, реализованные интерфейсы, используемые трейты и атрибуты) автоматически разрешаются (если это не отключено, см. ниже). Это означает, что в определениях необходимо использовать полностью квалифицированные имена классов, и в результирующем коде они будут заменены псевдонимами (основанными на положениях use) или полностью квалифицированными именами:
Результат:
Авторазрешение можно отключить следующим образом:
PHP-файлы
Классы, функции и пространства имен могут быть сгруппированы в файлы PHP, представленные классом PhpFile:
Результат:
Примечание: В файлы не может быть добавлен дополнительный код за пределами функций и классов.
Генерация с использованием Reflection
Помимо того, что вы можете моделировать классы и функции с помощью описанного выше API, вы также можете автоматически генерировать их на основе существующих:
Тела функций и методов по умолчанию пусты. Если вы хотите загрузить и
их, воспользуйтесь следующим способом (он требует установки
nikic/php-parser
):
Загрузка класса из файла
Вы также можете загружать функции, классы, интерфейсы и перечисления
непосредственно из строки PHP-кода. Например, мы создаем объект
ClassType
таким образом:
При загрузке классов из PHP-кода однострочные комментарии вне тела методов игнорируются (например, для свойств и т.д.), поскольку в этой библиотеке нет API для работы с ними.
Вы также можете загрузить непосредственно весь PHP-файл, который может содержать любое количество классов, функций или даже несколько пространств имен:
Начальный комментарий к файлу и объявление strict_types
также
загружаются. С другой стороны, весь остальной глобальный код
игнорируется.
Для этого необходимо установить nikic/php-parser
.
Если вам нужно манипулировать глобальным кодом в файлах или
отдельными утверждениями в телах методов, лучше использовать
непосредственно библиотеку nikic/php-parser
.
Манипулятор класса
Класс ClassManipulator предоставляет инструменты для манипулирования классами.
Метод inheritMethod()
копирует метод из родительского класса или
реализованного интерфейса в ваш класс. Это позволяет переопределить
метод или расширить его сигнатуру:
Метод inheritProperty()
копирует свойство из родительского класса в
ваш класс. Это полезно, когда вы хотите иметь то же свойство в своем
классе, но, возможно, с другим значением по умолчанию:
Метод implement()
автоматически реализует все методы и свойства
заданного интерфейса или абстрактного класса:
Дампинг переменных
Класс Dumper
возвращает разобранное строковое представление
переменной в формате PHP. Обеспечивает более качественный и четкий
вывод, чем родная функция var_export()
.
Таблица совместимости
PhpGenerator 4.1 совместим с PHP 8.0 – 8.4.