Генератор на 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, ellipsis, unpacking или three dots), използвайте setVariadic()
:
Генерира:
Метод и тяло на функцията
Тялото може да се предаде на метода setBody()
наведнъж или
последователно (ред по ред) чрез многократно извикване на
addBody()
:
Резултат
Можете да използвате специални заместители за удобен начин за инжектиране на променливи.
Обикновени заместители ?
Резултат:
Variadic placeholder ...?
Резултат:
Можете също така да използвате именувани параметри в 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()
автоматично имплементира всички методи и
свойства от дадения интерфейс или абстрактен клас:
Дъмпер за променливи
Dumper връща символно представяне на променлива в PHP низ. Осигурява
по-добър и по-ясен изход от нативната функция var_export()
.
Таблица за съвместимост
PhpGenerator 4.1 е съвместим с PHP 8.0 до 8.4.