Generator de coduri PHP
- Suportă toate cele mai recente caracteristici PHP (cum ar fi cârligele de proprietate, enumurile, atributele etc.)
- Vă permite să modificați cu ușurință clasele existente
- Ieșire conformă cu stilul de codare PSR-12 / PER
- Bibliotecă matură, stabilă și utilizată pe scară largă
Instalare
Descărcați și instalați pachetul folosind Composer:
Pentru compatibilitatea PHP, consultați tabelul.
Clase
Să începem cu un exemplu simplu de generare a unei clase folosind ClassType:
Acesta va reda acest rezultat:
De asemenea, putem folosi o imprimantă pentru a genera codul, pe care, spre deosebire de echo $class
, o vom
putea configura ulterior:
Putem adăuga constante (clasa Constant) și proprietăți (clasa Property):
Se generează:
Și putem adăuga metode:
Rezultă:
Parametrii promovați introduși de PHP 8.0 pot fi trecuți la constructor:
Aceasta are ca rezultat:
Proprietățile și clasele de citire exclusivă pot fi marcate prin intermediul setReadOnly()
.
În cazul în care proprietatea, constanta, metoda sau parametrul adăugat există deja, se aruncă o excepție.
Membrii pot fi eliminați utilizând removeProperty()
, removeConstant()
, removeMethod()
sau removeParameter()
.
De asemenea, se pot adăuga la clasă obiecte existente Method
, Property
sau
Constant
:
Puteți clona metodele, proprietățile și constantele existente cu un nume diferit folosind cloneWithName()
:
Interfață sau trăsătură
Puteți crea interfețe și trăsături (clasele InterfaceType și TraitType):
Utilizarea trăsăturilor:
Rezultat:
Enums
Puteți crea cu ușurință enumerațiile pe care le aduce PHP 8.1 (clasa EnumType):
Rezultat:
De asemenea, puteți defini echivalenți scalari pentru cazuri pentru a crea un enum susținut:
Este posibil să se adauge un comentariu sau atribute la fiecare caz folosind
addComment()
sau addAttribute()
.
Clasa Anonymous
Dați null
ca nume și veți avea o clasă anonimă:
Rezultat:
Funcția globală
Codul de funcții va genera clasa GlobalFunction:
Rezultat:
Închidere
Codul de închidere va genera clasa Closure:
Rezultat:
Funcția săgeată
De asemenea, puteți imprima închiderea ca funcție săgeată folosind imprimanta:
Rezultat:
Semnătura metodei și a funcției
Metodele sunt reprezentate de clasa Method. Puteți seta vizibilitatea, valoarea de returnare, adăuga comentarii, atribute etc:
Fiecare parametru este reprezentat de o clasă Parameter. Din nou, puteți seta toate proprietățile imaginabile:
Pentru a defini așa-numiții parametri variadici (sau, de asemenea, operatorul splat, spread, elipsis, unpacking sau trei
puncte), utilizați setVariadic()
:
Generates:
Metoda și corpul funcției
Corpul poate fi transmis metodei setBody()
o dată sau secvențial (linie cu linie) prin apelarea repetată a
metodei addBody()
:
Rezultat
Puteți utiliza caractere de poziție speciale pentru a injecta variabilele în mod practic.
Semne de poziție simple ?
Rezultat:
Variadic placeholder ...?
Rezultat:
De asemenea, puteți utiliza parametrii numiți din PHP 8 folosind caractere de poziție ...?:
Scăpați de locul rezervat utilizând slash \?
Rezultatul:
Imprimantele și conformitatea PSR
Clasa Printer este utilizată pentru a genera cod PHP:
Acesta poate genera cod pentru toate celelalte elemente, oferind metode precum printFunction()
,
printNamespace()
, etc.
În plus, este disponibilă clasa PsrPrinter
, a cărei ieșire este conformă cu stilul de codare PSR-2 / PSR-12
/ PER:
Aveți nevoie să ajustați comportamentul la nevoile dumneavoastră? Creați-vă propria imprimantă moștenind din clasa
Printer
. Puteți reconfigura aceste variabile:
Cum și de ce anume diferă standardul Printer
și PsrPrinter
? De ce nu există doar o singură
imprimantă, PsrPrinter
, în pachet?
Standardul Printer
formatează codul așa cum o facem în toată Nette. Deoarece Nette a fost creat mult mai
devreme decât PSR și, de asemenea, deoarece PSR timp de mulți ani nu a livrat standardele la timp, ci uneori chiar cu
o întârziere de câțiva ani de la introducerea unei noi caracteristici în PHP, acest lucru a dus la câteva diferențe minore
în standardul de codare. Cea mai mare diferență este doar
utilizarea tabulatoarelor în loc de spații. Știm că, prin utilizarea tabulațiilor în proiectele noastre, permitem ajustarea
lățimii, ceea ce este esențial pentru
persoanele cu deficiențe de vedere. Un exemplu de diferență minoră este plasarea acoladei curly brace pe o linie
separată pentru funcții și metode și întotdeauna. Considerăm că recomandarea PSR este ilogică și duce la o scădere a clarității
codului.
Tipuri
Fiecare tip sau tip de uniune/intersecție poate fi transmis ca un șir de caractere, puteți utiliza, de asemenea, constante predefinite pentru tipurile native:
Același lucru este valabil și pentru metoda setReturnType()
.
Literali
Cu Literal
puteți transmite cod PHP arbitrar, de exemplu, pentru valori implicite ale proprietăților sau
parametrilor etc:
Rezultat:
Puteți, de asemenea, să transmiteți parametri la Literal
și să formatați codul PHP valid folosind caractere de poziție speciale:
Literalul care reprezintă crearea unui nou obiect este generat cu ușurință prin metoda new
:
Atribute
Puteți adăuga atribute PHP 8 la toate clasele, metodele, proprietățile, constantele, cazurile enum, funcțiile, închiderile și parametrii. Literalii pot fi, de asemenea, utilizați ca valori de parametru.
Rezultat:
Cârlige de proprietate
De asemenea, puteți defini cârlige de proprietate (reprezentate de clasa PropertyHook) pentru operațiile get și set, o caracteristică introdusă în PHP 8.4:
Aceasta generează:
Proprietățile și cârligele de proprietate pot fi abstracte sau finale:
Vizibilitate asimetrică
PHP 8.4 introduce vizibilitatea asimetrică pentru proprietăți. Puteți seta niveluri de acces diferite pentru citire și scriere.
Vizibilitatea poate fi setată folosind fie metoda setVisibility()
cu doi parametri, fie folosind
setPublic()
, setProtected()
, sau setPrivate()
cu parametrul mode
care
specifică dacă vizibilitatea se aplică la obținerea sau setarea proprietății. Modul implicit este 'get'
.
Acest lucru generează:
Spațiul de nume
Clasele, trăsăturile, interfețele și enumerațiile (denumite în continuare clase) pot fi grupate în spații de nume (PhpNamespace):
În cazul în care clasa există deja, se aruncă o excepție.
Puteți defini declarații de utilizare:
Pentru a simplifica un nume de clasă, funcție sau constantă complet calificat în conformitate cu aliasurile definite,
utilizați metoda simplifyName
:
În schimb, puteți converti un nume simplificat de clasă, funcție sau constantă într-un nume complet calificat utilizând
metoda resolveName
:
Rezolvarea numelor de clase
Când o clasă face parte dintr-un spațiu de nume, aceasta este redată în mod ușor diferit: toate tipurile (de exemplu, indicii de tip, tipuri de returnare, numele clasei părinte, interfețe implementate, trăsături utilizate și atribute) sunt automat rezolvate (dacă nu le dezactivați, a se vedea mai jos). Acest lucru înseamnă că trebuie să utilizați nume de clasă complet calificate în definiții, iar acestea vor fi înlocuite cu pseudonime (pe baza clauzelor de utilizare) sau cu nume complet calificate în codul rezultat:
Rezultat:
Rezolvarea automată poate fi dezactivată în acest mod:
Fișiere PHP
Clasele, funcțiile și spațiile de nume pot fi grupate în fișiere PHP reprezentate de clasa PhpFile:
Rezultat:
Atenție: Nu se poate adăuga niciun cod suplimentar la fișiere în afara funcțiilor și claselor.
Generarea în funcție de cele existente
Pe lângă posibilitatea de a modela clase și funcții utilizând API-ul descris mai sus, puteți, de asemenea, să le generați automat în funcție de cele existente:
Corpurile funcțiilor și metodelor sunt goale în mod implicit. Dacă doriți să le încărcați și pe acestea, utilizați
această modalitate (necesită instalarea nikic/php-parser
):
Încărcare din fișierul PHP
De asemenea, puteți încărca funcții, clase, interfețe și enume direct dintr-un șir de cod PHP. De exemplu, creăm
obiectul ClassType
în acest mod:
La încărcarea claselor din codul PHP, comentariile pe o singură linie din afara corpului metodelor sunt ignorate (de exemplu, pentru proprietăți etc.), deoarece această bibliotecă nu dispune de un API pentru a lucra cu acestea.
De asemenea, puteți încărca direct întregul fișier PHP, care poate conține orice număr de clase, funcții sau chiar mai multe spații de nume:
Se încarcă, de asemenea, comentariul inițial al fișierului și declarația strict_types
. Pe de altă parte,
toate celelalte coduri globale sunt ignorate.
Acest lucru necesită instalarea nikic/php-parser
.
Dacă aveți nevoie să manipulați codul global din fișiere sau declarațiile individuale din corpurile
metodelor, este mai bine să utilizați direct biblioteca nikic/php-parser
.
Manipulator de clasă
Clasa ClassManipulator oferă instrumente pentru manipularea claselor.
Metoda inheritMethod()
copiază o metodă dintr-o clasă părinte sau dintr-o interfață implementată în
clasa dumneavoastră. Acest lucru vă permite să suprascrieți metoda sau să-i extindeți semnătura:
Metoda inheritProperty()
copiază o proprietate dintr-o clasă părinte în clasa dumneavoastră. Acest lucru
este util atunci când doriți să aveți aceeași proprietate în clasa dvs., dar eventual cu o valoare implicită
diferită:
Metoda implement()
implementează automat toate metodele și proprietățile din interfața sau clasa
abstractă dată:
Descărcător de variabile
Dumper returnează o reprezentare de tip șir de caractere PHP analizabilă a unei variabile. Oferă o ieșire mai bună și
mai clară decât funcția nativă var_export()
.
Tabel de compatibilitate
PhpGenerator 4.1 este compatibil cu PHP 8.0 până la 8.4.