Генератор PHP коду
- Підтримує всі найновіші можливості PHP (наприклад, хуки властивостей, зчислення, атрибути тощо).
- Дозволяє легко модифікувати існуючі класи
- Вихід, сумісний зі стилем кодування PSR-12 / PER
- Зріла, стабільна та широко використовувана бібліотека
Встановлення
Завантажте та встановіть пакунок за допомогою Composer:
Сумісність з PHP див. у таблиці.
Класи
Почнемо з простого прикладу створення класу за допомогою ClassType:
Він відобразить такий результат:
Ми також можемо використовувати принтер для генерації коду, який, на
відміну від 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, еліпсис, розпакування або три крапки)
використовуйте 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):
Якщо клас вже існує, він генерує виключення.
Ви можете визначати оператори використання:
Щоб спростити повністю кваліфіковане ім'я класу, функції або
константи відповідно до визначених псевдонімів, використовуйте метод
simplifyName
:
І навпаки, ви можете перетворити спрощене ім'я класу, функції або
константи на повне за допомогою методу resolveName
:
Приведення імен класів
Коли клас є частиною простору імен, він відображається дещо інакше: всі типи (наприклад, підказки типів, типи повернення, ім'я батьківського класу, реалізовані інтерфейси, використані риси та атрибути) автоматично розв'язуються (якщо ви не вимкнете цю опцію, див. нижче). Це означає, що ви повинні використовувати повні імена класів у визначеннях, і вони будуть замінені псевдонімами (на основі клаузул використання) або повними іменами у результуючому коді:
Результат:
Авторозв'язання можна вимкнути таким чином:
Файли PHP
Класи, функції та простори імен можуть бути згруповані у PHP-файли, представлені класом PhpFile:
Результат:
Зверніть увагу: До файлів не можна додавати додатковий код за межами функцій та класів.
Генерувати відповідно до існуючого
Окрім можливості моделювати класи та функції за допомогою API, описаного вище, ви також можете автоматично генерувати їх на основі вже існуючих:
Тіла функцій і методів за замовчуванням порожні. Якщо ви хочете
завантажити їх, скористайтеся цим способом (для цього потрібно, щоб
було встановлено nikic/php-parser
):
Завантаження з PHP-файлу
Ви також можете завантажувати функції, класи, інтерфейси та
зчислення безпосередньо з рядка PHP-коду. Наприклад, ми створюємо об'єкт
ClassType
таким чином:
При завантаженні класів з PHP-коду ігноруються однорядкові коментарі за межами тіл методів (наприклад, для властивостей тощо), оскільки ця бібліотека не має API для роботи з ними.
Ви також можете завантажити безпосередньо весь PHP-файл, який може містити будь-яку кількість класів, функцій або навіть декілька просторів імен:
Також завантажуються початковий коментар до файлу та декларація
strict_types
. З іншого боку, весь інший глобальний код ігнорується.
Для цього потрібно, щоб було встановлено nikic/php-parser
.
Якщо вам потрібно маніпулювати глобальним кодом у файлах або
окремими операторами в тілах методів, краще використовувати
безпосередньо бібліотеку nikic/php-parser
.
Клас Маніпулятор
Клас ClassManipulator надає інструменти для маніпулювання класами.
Метод inheritMethod()
копіює метод з батьківського класу або
реалізованого інтерфейсу у ваш клас. Це дозволяє перевизначити метод
або розширити його сигнатуру:
Метод inheritProperty()
копіює властивість з батьківського класу у
ваш клас. Це корисно, коли ви хочете мати таку саму властивість у своєму
класі, але, можливо, з іншим значенням за замовчуванням:
Метод implement()
автоматично реалізує всі методи і властивості з
даного інтерфейсу або абстрактного класу:
Дампер змінних
Дампер повертає розбірне PHP-рядкове представлення змінної.
Забезпечує кращий і чіткіший вивід, ніж рідна функція var_export()
.
Таблиця сумісності
PhpGenerator 4.1 сумісний з версіями PHP від 8.0 до 8.4.