Generátor PHP kódu
- Umí všechny nejnovější vychytávky v PHP (jako property hooks, enumy, atributy atd.)
- Umožní vám snadno modifikovat existující třídy
- Výstupní kód je v souladu s PSR-12 / PER coding style
- Zralá, stabilní a široce používaná knihovna
Instalace
Knihovnu stáhnete a nainstalujete pomocí nástroje Composer:
Kompatibilitu s PHP naleznete v tabulce.
Třídy
Začněme rovnou příkladem tvorby třídy pomocí ClassType:
Vrátí následující výsledek:
K vygenerování kódu můžeme také použít tzv. printer, který na rozdíl od echo $class
budeme moci dále konfigurovat:
Můžeme přidat konstanty (třída Constant) a proměnné (třída Property):
Vygeneruje:
A můžeme přidat metody:
Výsledkem je:
Propagované parametry zavedené PHP 8.0 lze předat konstruktoru:
Výsledkem je:
Vlastnosti a třídy určené pouze pro čtení lze označit pomocí funkce setReadOnly()
.
Pokud přidaná vlastnost, konstanta, metoda nebo parametr již existují, vyhodí se výjimka.
Členy třídy lze odebrat pomocí removeProperty()
, removeConstant()
, removeMethod()
nebo removeParameter()
.
Do třídy můžete také přidat existující objekty Method
, Property
nebo
Constant
:
Můžete také klonovat stávající metody, vlastnosti a konstanty pod jiným názvem pomocí
cloneWithName()
:
Interface nebo traita
Můžete vytvářet rozhraní a traity (třídy InterfaceType a TraitType):
Používání trait:
Výsledek:
Enums
Výčty, které přináší PHP 8.1, můžete snadno vytvořit takto: (třída EnumType):
Výsledek:
Můžete také definovat skalární ekvivalenty a vytvořit tak „backed“ výčet:
Ke každému case je možné přidat komentář nebo atributy pomocí
addComment()
nebo addAttribute()
.
Anonymní třídy
Jako název předáme null
a máme anonymní třídu:
Výsledek:
Globální funkce
Kód funkcí generuje třída GlobalFunction:
Výsledek:
Anonymní funkce
Kód anonymních funkcí generuje třída Closure:
Výsledek:
Zkrácené arrow funkce
Můžete také vypsat zkrácenou anonymní funkci pomocí printeru:
Výsledek:
Signatury metod a funkcí
Metody reprezentuje třída Method. Můžete nastavit viditelnost, návratovou hodnotu, přidat komentáře, atributy atd:
Jednotlivé parametry reprezentuje třídy Parameter. Opět můžete nastavit všechny myslitelné vlastnosti:
Pro definici tzv. variadics parametrů (nebo též splat operátor) slouží setVariadic()
:
Vygeneruje:
Těla metod a funkcí
Tělo lze předat najednou metodě setBody()
nebo postupně (po řádcích) opakovaným voláním
addBody()
:
Výsledek
Můžete použít speciální zástupné znaky pro snadné vkládání proměnných.
Jednoduché zástupné symboly ?
Výsledek
Zástupný znak pro variadic ...?
Výsledek:
Můžete také použít pojmenované parametry pro PHP 8 pomocí ...?:
Zástupný symbol se escapuje pomocí lomítka \?
Výsledek:
Printer a soulad s PSR
Ke generování PHP kódu slouží třída Printer:
Umí vygenerovat kód všech dalších prvků, nabízí metody jako printFunction()
,
printNamespace()
, atd.
K dispozici je také třída PsrPrinter
, jejíž výstup je v souladu s PSR-2 / PSR-12 / PER coding style:
Potřebujete chování doladit na míru? Vytvořte si vlastní verzi poděděním třídy Printer
. Lze
překonfigurovat tyto proměnné:
Jak a proč se vlastně liší standardní Printer
a PsrPrinter
? Proč není v balíčku jen jeden
printer, a to PsrPrinter
?
Standardní Printer
formátuje kód tak, jak to děláme v celém Nette. Tím, že Nette vzniklo mnohem dřív,
než PSR, a také proto, že PSR dlouhé roky nedodávalo standardy včas, ale třeba až s několikaletým zpožděním od
uvedení nové featury v PHP, došlo k tomu, že kódovací
standard se v několika drobnostech liší. Větším rozdílem je jen používání tabulátorů místo mezer. Víme, že
používáním tabulátorů v našich projektech umožňujeme přizpůsobení šířky, které je pro lidi se zrakovým postižením nezbytné.
Příkladem drobné odlišnosti je umístění složené závorky na samostatném řádku u funkcí a metod a to vždy.
Doporučení PSR se nám jeví jako nelogické a vede k snížení přehlednosti kódu.
Typy
Každý typ nebo union/intersection typ lze předat jako řetězec, můžete také použít předdefinované konstanty pro nativní typy:
Totéž platí pro metodu setReturnType()
.
Literály
Pomocí Literal
můžete předávat libovolný kód PHP, například pro výchozí hodnoty vlastností nebo
parametrů atd:
Výsledek:
Můžete také předat parametry do Literal
a nechat je zformátovat do platného kódu PHP pomocí zástupných znaků:
Literál představující vytvoření nového objektu lze snadno vygenerovat pomocí metody new
:
Atributy
PHP 8 atributy můžete přidat do všech tříd, metod, vlastností, konstant, enumů, funkcí, closures a parametrů. Jako hodnoty parametrů lze používat i literály.
Výsledek:
Property Hooks
Pomocí property hooks (reprezentované třídou PropertyHook) můžete definovat operace get a set pro vlastnosti, což je funkce zavedená v PHP 8.4:
Vygeneruje:
Property a property hooks mohou být abstraktní nebo finální:
Asymetrická viditelnost
PHP 8.4 zavádí asymetrickou viditelnost pro vlastnosti. Můžete nastavit různé úrovně přístupu pro čtení a zápis.
Viditelnost lze nastavit buď pomocí metody setVisibility()
se dvěma parametry, nebo pomocí
setPublic()
, setProtected()
nebo setPrivate()
s parametrem mode
, který
určuje, zda se viditelnost vztahuje ke čtení nebo zápisu vlastnosti. Výchozí režim je 'get'
.
Vygeneruje:
Jmenný prostor
Třídy, vlastnosti, rozhraní a výčty (dále jen třídy) lze seskupit do jmenných prostorů reprezentovaných třídou PhpNamespace:
Pokud třída již existuje, vyhodí se výjimka.
Můžete definovat klauzule use:
Chcete-li zjednodušit plně kvalifikovaný název třídy, funkce nebo konstanty podle definovaných aliasů, použijte metodu
simplifyName
:
Zjednodušený název třídy, funkce nebo konstanty můžete naopak převést na plně kvalifikovaný název pomocí metody
resolveName
:
Překlady názvů tříd
Když je třída součástí jmenného prostoru, je vykreslena mírně odlišně: všechny typy (například typehinty, návratové typy, název rodičovské třídy, implementovaná rozhraní, použité vlastnosti a atributy) jsou automaticky překládány (pokud to nevypnete, viz níže). To znamená, že musíte v definicích používat úplné názvy tříd a ty budou nahrazeny za aliasy (podle klauzulí use) nebo za plně kvalifikovaná jména ve výsledném kódu:
Výsledek:
Automatické překládání lze vypnout tímto způsobem:
PHP soubory
Třídy, funkce a jmenné prostory lze seskupit do PHP souborů reprezentovaných třídou PhpFile:
Výsledek:
Upozornění: Do souborů není možné přidávat žádný další kód mimo funkce a třídy.
Generování podle existujících
Kromě toho, že třídy a funkce můžete modelovat pomocí výše popsaného API, je můžete také nechat vygenerovat automaticky podle existujících vzorů:
Těla funkcí a metod jsou ve výchozím stavu prázdná. Pokud je chcete také načíst, použijte tento způsob (vyžaduje
instalaci balíčku nikic/php-parser
):
Načítání z PHP souborů
Funkce, třídy, rozhraní a enumy můžete načítat také přímo z řetězce obsahujícího PHP kód. Například takto
vytvoříme objekt ClassType
:
Při načítání tříd z kódu PHP jsou jednořádkové komentáře mimo těla metod ignorovány (např. u properties atd.), protože tato knihovna nemá API pro práci s nimi.
Můžete také načíst přímo celý soubor PHP, který může obsahovat libovolný počet tříd, funkcí nebo dokonce jmenných prostorů:
Načte se také úvodní komentář k souboru a deklarace strict_types
. Naopak veškerý ostatní globální kód
je ignorován.
Vyžaduje se, aby byl nainstalován nikic/php-parser
.
Pokud potřebujete manipulovat s globálním kódem v souborech nebo s jednotlivými příkazy v tělech
metod, je lepší použít přímo knihovnu nikic/php-parser
.
Class Manipulator
Třída ClassManipulator poskytuje nástroje pro manipulaci s třídami.
Metoda inheritMethod()
zkopíruje metodu z rodičovské třídy nebo implementovaného rozhraní do vaší
třídy. To vám umožní přepsat metodu nebo rozšířit její signaturu:
Metoda implement()
automaticky implementuje všechny metody a vlastnosti z daného rozhraní nebo abstraktní
třídy ve vaší třídě:
Výpis proměnných
Třída Dumper
převede proměnnou do parsovatelného PHP kódu. Poskytuje lepší a přehlednější výstup než
standardní funkce var_export()
.
Tabulka kompatibility
PhpGenerator 4.1 je kompatibilní s PHP 8.0 až 8.4.