Generator kodu PHP
- Obsługuje wszystkie najnowsze funkcje PHP (takie jak haki właściwości, enumy, atrybuty itp.).
- Pozwala na łatwą modyfikację istniejących klas
- Wyjście zgodne ze stylem kodowania PSR-12 / PER
- Dojrzała, stabilna i szeroko stosowana biblioteka
Instalacja
Pobierz i zainstaluj pakiet za pomocą Composera:
W celu uzyskania informacji o kompatybilności z PHP, patrz tabela.
Klasy
Zacznijmy od prostego przykładu generowania klasy za pomocą ClassType:
Wyrenderuje on taki wynik:
Do wygenerowania kodu możemy również użyć drukarki, którą w przeciwieństwie do echo $class
, będziemy
mogli dodatkowo skonfigurować:
Możemy dodać stałe (klasa Constant) i właściwości (klasa Property):
Generuje:
I możemy dodać metody:
Wynika z tego, że:
Parametry promowane wprowadzone przez PHP 8.0 mogą być przekazywane do konstruktora:
Skutkuje to:
Właściwości i klasy readonly mogą być oznaczone poprzez setReadOnly()
.
Jeśli dodana właściwość, stała, metoda lub parametr już istnieje, rzuca wyjątek.
Członków można usunąć używając removeProperty()
, removeConstant()
, removeMethod()
lub removeParameter()
.
Możesz również dodać do klasy istniejące obiekty Method
, Property
lub Constant
:
Możesz sklonować istniejące metody, właściwości i stałe z inną nazwą używając cloneWithName()
:
Interface lub Trait
Można tworzyć interfejsy i cechy (klasy InterfaceType i TraitType):
Wykorzystanie cech:
Wynik:
Enums
Możesz łatwo stworzyć enum, które przynosi PHP 8.1 (klasa EnumType):
Wynik:
Możesz również zdefiniować skalarne odpowiedniki dla przypadków, aby utworzyć backed enum:
Możliwe jest dodanie komentarza lub atrybutów do każdego przypadku za pomocą
addComment()
lub addAttribute()
.
Klasa anonimowa
Podaj null
jako nazwę i masz klasę anonimową:
Wynik:
Funkcja globalna
Kod funkcji wygeneruje klasa GlobalFunction:
Result:
Zamknięcie
Kod zamknięcia wygeneruje klasę Closure:
Wynik:
Funkcja strzałki
Możesz również wydrukować zamknięcie jako funkcję strzałki za pomocą drukarki:
Wynik:
Sygnatura metody i funkcji
Metody są reprezentowane przez klasę Method. Możesz ustawić widoczność, wartość zwrotną, dodać komentarze, atrybuty itp:
Każdy parametr jest reprezentowany przez klasę Parameter. Ponownie, możesz ustawić każdą możliwą właściwość:
Aby zdefiniować tzw. parametry variadics (lub również operator splat, spread, elipsa, rozpakowywanie czy trzy kropki),
należy użyć setVariadic()
:
Generates:
Metoda i ciało funkcji
Ciało może być przekazane do metody setBody()
jednorazowo lub sekwencyjnie (linia po linii) poprzez wielokrotne
wywołanie addBody()
:
Result
Możesz użyć specjalnych zamienników dla poręcznego sposobu wstrzykiwania zmiennych.
Proste symbole miejsc ?
Wynik:
Variadic placeholder ...?
Wynik:
Możesz również użyć PHP 8 nazwanych parametrów używając placeholder ...?:
Ucieknij od placeholder używając slash \?
Wynik:
Drukarki i zgodność z PSR
Klasa Printer służy do generowania kodu PHP:
Może generować kod dla wszystkich innych elementów, oferując metody takie jak printFunction()
,
printNamespace()
, itp.
Dodatkowo dostępna jest klasa PsrPrinter
, której dane wyjściowe są zgodne ze stylem kodowania PSR-2 / PSR-12
/ PER:
Chcesz dostosować zachowanie do swoich potrzeb? Utwórz własną drukarkę, dziedzicząc z klasy Printer
.
Możesz ponownie skonfigurować te zmienne:
Czym i dlaczego dokładnie różnią się standardowe Printer
i PsrPrinter
? Dlaczego w pakiecie nie
ma tylko jednej drukarki, PsrPrinter
?
Standard Printer
formatuje kod tak, jak robimy to we wszystkich Nette. Ponieważ Nette powstało znacznie
wcześniej niż PSR, a także dlatego, że PSR przez wiele lat nie dostarczało standardów na czas, ale czasami nawet
z kilkuletnim opóźnieniem od wprowadzenia nowej funkcji w PHP, spowodowało to kilka drobnych różnic w standardzie kodowania. Większą różnicą jest właśnie używanie
tabulatorów zamiast spacji. Wiemy, że stosując tabulatory w naszych projektach umożliwiamy dostosowanie szerokości, co jest
istotne dla osób z wadami wzroku.
Przykładem drobnej różnicy jest umieszczenie nawiasu klamrowego w osobnej linii dla funkcji i metod oraz zawsze. Uważamy, że
zalecenie PSR jest nielogiczne i prowadzi do
zmniejszenia przejrzystości kodu.
Typy
Każdy typ lub typ unii / przecięcia może być przekazany jako ciąg, możesz również użyć predefiniowanych stałych dla typów natywnych:
To samo dotyczy metody setReturnType()
.
Literały
Dzięki Literal
możesz przekazać dowolny kod PHP do, na przykład, domyślnych wartości właściwości lub
parametrów itp:
Wynik:
Możesz również przekazać parametry do Literal
i mieć je sformatowane w poprawny kod PHP za pomocą specjalnych placeholderów:
Literał reprezentujący utworzenie nowego obiektu jest łatwo generowany przez metodę new
:
Atrybuty
Możesz dodać atrybuty PHP 8 do wszystkich klas, metod, właściwości, stałych, przypadków enum, funkcji, domknięć i parametrów. Literały mogą być również używane jako wartości parametrów.
Wynik:
Haki nieruchomości
Można również definiować haki właściwości (reprezentowane przez klasę PropertyHook) dla operacji pobierania i ustawiania, funkcja wprowadzona w PHP 8.4:
To generuje:
Właściwości i haki właściwości mogą być abstrakcyjne lub końcowe:
Asymetryczna widoczność
PHP 8.4 wprowadza asymetryczną widoczność właściwości. Można ustawić różne poziomy dostępu dla odczytu i zapisu.
Widoczność można ustawić za pomocą metody setVisibility()
z dwoma parametrami lub za pomocą
setPublic()
, setProtected()
, lub setPrivate()
z parametrem mode
, który
określa, czy widoczność dotyczy pobierania czy ustawiania właściwości. Domyślnym trybem jest 'get'
.
To generuje:
Przestrzeń nazw
Klasy, cechy, interfejsy i enum (dalej klasy) mogą być grupowane w przestrzenie nazw(PhpNamespace):
Jeśli klasa już istnieje, to rzuca wyjątek.
Możesz zdefiniować oświadczenia o użyciu:
Aby uprościć w pełni kwalifikowaną nazwę klasy, funkcji lub stałej zgodnie ze zdefiniowanymi aliasami, użyj metody
simplifyName
:
I odwrotnie, można przekształcić uproszczoną nazwę klasy, funkcji lub stałej na w pełni kwalifikowaną, używając
metody resolveName
:
Class Names Resolving (rozwiązywanie nazw klas)
Gdy klasa jest częścią przestrzeni nazw, jest renderowana nieco inaczej: wszystkie typy (np. podpowiedzi typów, typy zwracane, nazwa klasy nadrzędnej, zaimplementowane interfejsy, używane cechy i atrybuty) są automatycznie rozwiązywane (chyba że to wyłączysz, patrz poniżej). Oznacza to, że musisz używać w pełni kwalifikowanych nazw klas w definicjach, a zostaną one zastąpione aliasami (opartymi na klauzulach użycia) lub w pełni kwalifikowanymi nazwami w wynikowym kodzie:
Wynik:
Auto-resolving można wyłączyć w ten sposób:
Pliki PHP.
Klasy, funkcje i przestrzenie nazw mogą być pogrupowane w pliki PHP reprezentowane przez klasę PhpFile:
Wynik:
Uwaga: Do plików nie można dodawać żadnego dodatkowego kodu poza funkcjami i klasami.
Generowanie według istniejących
Oprócz możliwości modelowania klas i funkcji za pomocą opisanego powyżej API, można również zlecić ich automatyczne generowanie według istniejących:
Ciała funkcji i metod są domyślnie puste. Jeśli chcesz je również załadować, użyj tego sposobu (wymaga on
zainstalowania nikic/php-parser
):
Ładowanie z pliku PHP
Można też ładować funkcje, klasy, interfejsy i enumy bezpośrednio z ciągu kodu PHP. Na przykład tworzymy obiekt
ClassType
w ten sposób:
Podczas ładowania klas z kodu PHP, komentarze jednolinijkowe poza ciałami metod są ignorowane (np. dla właściwości itp.), ponieważ ta biblioteka nie posiada API do pracy z nimi.
Możesz również załadować bezpośrednio cały plik PHP, który może zawierać dowolną liczbę klas, funkcji, a nawet wiele przestrzeni nazw:
Ładowany jest również początkowy komentarz do pliku oraz deklaracja strict_types
. Z drugiej strony, wszystkie
inne globalne kody są ignorowane.
Wymaga to zainstalowania nikic/php-parser
.
Jeśli musisz manipulować globalnym kodem w plikach lub pojedynczymi stwierdzeniami w ciałach metod, lepiej jest
użyć bezpośrednio biblioteki nikic/php-parser
.
Class Manipulator
Klasa ClassManipulator zapewnia narzędzia do manipulowania klasami.
Metoda inheritMethod()
kopiuje metodę z klasy nadrzędnej lub zaimplementowanego interfejsu do klasy
użytkownika. Pozwala to na nadpisanie metody lub rozszerzenie jej sygnatury:
Metoda inheritProperty()
kopiuje właściwość z klasy nadrzędnej do klasy użytkownika. Jest to przydatne, gdy
chcesz mieć tę samą właściwość w swojej klasie, ale prawdopodobnie z inną wartością domyślną:
Metoda implement()
automatycznie implementuje wszystkie metody i właściwości z danego interfejsu lub klasy
abstrakcyjnej:
Zrzutka zmiennych
Dumper zwraca parsowalną reprezentację zmiennej w PHP. Zapewnia lepsze i bardziej przejrzyste wyjście niż funkcja natywna
var_export()
.
Tabela kompatybilności
PhpGenerator 4.1 jest kompatybilny z PHP 8.0 do 8.4.