Generatore di codice PHP
- Supporta tutte le più recenti caratteristiche di PHP (come gli agganci per le proprietà, gli enum, gli attributi e così via).
- Permette di modificare facilmente le classi esistenti
- Uscita conforme allo stile di codifica PSR-12 / PER
- Libreria matura, stabile e ampiamente utilizzata
Installazione
Scaricare e installare il pacchetto utilizzando Composer:
Per la compatibilità con PHP, vedere la tabella.
Classi
Cominciamo con un esempio semplice di generazione di classi usando ClassType:
Il risultato sarà questo:
Possiamo anche utilizzare una stampante per generare il codice che, a differenza di echo $class
, potremo configurare ulteriormente:
Possiamo aggiungere costanti (classe Constant) e proprietà (classe Property):
Genera:
E possiamo aggiungere metodi:
Il risultato è:
I parametri promossi introdotti da PHP 8.0 possono essere passati al costruttore:
Il risultato è:
Le proprietà e le classi di sola lettura possono essere contrassegnate tramite setReadOnly()
.
Se la proprietà, la costante, il metodo o il parametro aggiunto esistono già, viene lanciata un'eccezione.
I membri possono essere rimossi utilizzando removeProperty()
, removeConstant()
,
removeMethod()
o removeParameter()
.
È anche possibile aggiungere alla classe oggetti esistenti Method
, Property
o
Constant
:
È possibile clonare metodi, proprietà e costanti esistenti con un nome diverso, utilizzando cloneWithName()
:
Interfaccia o tratto
È possibile creare interfacce e tratti (classi InterfaceType e TraitType):
Utilizzo dei tratti:
Risultato:
Enum
È possibile creare facilmente gli enum introdotti da PHP 8.1 (classe EnumType):
Risultato:
È possibile definire anche equivalenti scalari per i casi, in modo da creare un'enum supportata:
È possibile aggiungere un commento o degli attributi a ciascun caso utilizzando
addComment()
o addAttribute()
.
Classe anonima
Date il nome null
e avrete una classe anonima:
Risultato:
Funzione globale
Il codice delle funzioni genererà la classe GlobalFunction:
Risultato:
Chiusura
Il codice delle chiusure genererà la classe Closure:
Risultato:
Funzione freccia
È inoltre possibile stampare la chiusura come funzione freccia utilizzando la stampante:
Risultato:
Firma di metodi e funzioni
I metodi sono rappresentati dalla classe Metodo. È possibile impostare la visibilità, il valore di ritorno, aggiungere commenti, attributi ecc:
Ogni parametro è rappresentato da una classe Parametro. Anche in questo caso, si possono impostare tutte le proprietà possibili:
Per definire i cosiddetti parametri variadici (o anche gli operatori splat, spread, ellipsis, unpacking o tre punti),
utilizzare setVariadic()
:
Genera:
Metodo e corpo della funzione
Il corpo può essere passato al metodo setBody()
in una sola volta o in sequenza (riga per riga) chiamando
ripetutamente addBody()
:
Risultato
È possibile utilizzare segnaposto speciali per iniettare variabili in modo pratico.
Segnaposto semplici ?
Risultato:
Segnaposto variabile ...?
Risultato:
È anche possibile utilizzare i parametri denominati di PHP 8 utilizzando il segnaposto ...?:
Sfuggire al segnaposto usando una barra \?
Risultato:
Stampanti e conformità PSR
La classe Printer viene utilizzata per generare codice PHP:
Può generare codice per tutti gli altri elementi, offrendo metodi come printFunction()
,
printNamespace()
, ecc.
Inoltre, è disponibile la classe PsrPrinter
, il cui output è conforme allo stile di codifica PSR-2 / PSR-12
/ PER:
Avete bisogno di regolare il comportamento in base alle vostre esigenze? Create la vostra stampante ereditando dalla classe
Printer
. È possibile riconfigurare queste variabili:
Come e perché differiscono esattamente le stampanti standard Printer
e PsrPrinter
? Perché non c'è
una sola stampante, PsrPrinter
, nel pacchetto?
Lo standard Printer
formatta il codice come lo facciamo in tutto Nette. Poiché Nette è stato creato molto prima
di PSR, e anche perché PSR per molti anni non ha consegnato gli standard in tempo, ma a volte anche con diversi anni di ritardo
dall'introduzione di una nuova funzionalità in PHP, questo ha portato ad alcune piccole differenze nello standard di codifica. La differenza maggiore è solo l'uso dei
tabulatori al posto degli spazi. Sappiamo che l'uso delle tabulazioni nei nostri progetti consente di regolare la larghezza, il
che è essenziale per le persone con
problemi di vista. Un esempio di differenza minore è il posizionamento della parentesi graffa su una riga separata per
funzioni e metodi e sempre. Riteniamo che la raccomandazione del PSR sia illogica e porti a una diminuzione della chiarezza del
codice.
Tipi
Ogni tipo o tipo di unione/intersezione può essere passato come stringa; si possono anche usare costanti predefinite per i tipi nativi:
Lo stesso vale per il metodo setReturnType()
.
Letterali
Con Literal
è possibile passare codice PHP arbitrario, ad esempio per i valori predefiniti di proprietà
o parametri, ecc:
Risultato:
È anche possibile passare dei parametri a Literal
e farli formattare in codice PHP valido, utilizzando speciali segnaposto:
Il letterale che rappresenta la creazione di un nuovo oggetto è facilmente generabile con il metodo new
:
Attributi
È possibile aggiungere attributi di PHP 8 a tutte le classi, i metodi, le proprietà, le costanti, i casi enum, le funzioni, le chiusure e i parametri. Anche i letterali possono essere usati come valori dei parametri.
Risultato:
Ganci di proprietà
È possibile definire anche degli hook di proprietà (rappresentati dalla classe PropertyHook) per le operazioni di get e set, una caratteristica introdotta in PHP 8.4:
Questo genera:
Le proprietà e i ganci di proprietà possono essere astratti o finali:
Visibilità asimmetrica
PHP 8.4 introduce la visibilità asimmetrica per le proprietà. È possibile impostare diversi livelli di accesso per la lettura e la scrittura.
La visibilità può essere impostata utilizzando il metodo setVisibility()
con due parametri, oppure utilizzando
setPublic()
, setProtected()
, o setPrivate()
con il parametro mode
che
specifica se la visibilità si applica a ottenere o impostare la proprietà. La modalità predefinita è 'get'
.
Questo genera:
Spazio dei nomi
Classi, tratti, interfacce ed enum (di seguito classi) possono essere raggruppati in spazi dei nomi (PhpNamespace):
Se la classe esiste già, viene lanciata un'eccezione.
È possibile definire dichiarazioni d'uso:
Per semplificare il nome di una classe, di una funzione o di una costante completamente qualificata secondo gli alias
definiti, utilizzare il metodo simplifyName
:
Al contrario, è possibile convertire un nome di classe, funzione o costante semplificato in uno pienamente qualificato,
utilizzando il metodo resolveName
:
Risoluzione dei nomi di classe
Quando una classe fa parte di uno spazio dei nomi, viene resa in modo leggermente diverso: tutti i tipi (ad esempio, i suggerimenti sui tipi, i tipi di ritorno, il nome della classe madre, le interfacce implementate, i tratti utilizzati e gli attributi) vengono automaticamente risolti (a meno che non si disattivi, vedere sotto). Ciò significa che è necessario usare nomi di classe **completamente qualificati nelle definizioni, che verranno sostituiti con alias (basati su clausole di utilizzo) o nomi pienamente qualificati nel codice risultante:
Risultato:
In questo modo è possibile disattivare la risoluzione automatica:
File PHP
Classi, funzioni e spazi dei nomi possono essere raggruppati in file PHP rappresentati dalla classe PhpFile:
Risultato:
**Nota: ** Non è possibile aggiungere altro codice ai file al di fuori delle funzioni e delle classi.
Generare in base a quelli esistenti
Oltre a poter modellare classi e funzioni utilizzando le API descritte in precedenza, è anche possibile generarle automaticamente in base a quelle esistenti:
I corpi delle funzioni e dei metodi sono vuoti per impostazione predefinita. Se si desidera caricarli, utilizzare questo
metodo (richiede l'installazione di nikic/php-parser
):
Caricamento da file PHP
È anche possibile caricare funzioni, classi, interfacce ed enum direttamente da una stringa di codice PHP. Ad esempio, creiamo
l'oggetto ClassType
in questo modo:
Quando si caricano le classi dal codice PHP, i commenti di una sola riga al di fuori dei corpi dei metodi vengono ignorati (ad esempio per le proprietà, ecc.), perché questa libreria non dispone di un'API per gestirli.
È anche possibile caricare direttamente l'intero file PHP, che può contenere un numero qualsiasi di classi, funzioni o anche spazi dei nomi multipli:
Vengono caricati anche il commento iniziale del file e la dichiarazione strict_types
. D'altra parte, tutto il
resto del codice globale viene ignorato.
Questo richiede l'installazione di nikic/php-parser
.
Se è necessario manipolare il codice globale nei file o le singole dichiarazioni nei corpi dei metodi, è meglio
usare direttamente la libreria nikic/php-parser
.
Manipolatore di classe
La classe ClassManipulator fornisce strumenti per la manipolazione delle classi.
Il metodo inheritMethod()
copia un metodo da una classe padre o da un'interfaccia implementata nella propria
classe. Ciò consente di sovrascrivere il metodo o di estenderne la firma:
Il metodo inheritProperty()
copia una proprietà da una classe padre nella vostra classe. È utile quando si vuole
avere la stessa proprietà nella propria classe, ma eventualmente con un valore predefinito diverso:
Il metodo implement()
implementa automaticamente tutti i metodi e le proprietà dell'interfaccia o della classe
astratta indicata:
Dumper di variabili
Dumper restituisce una rappresentazione in stringhe PHP parsabili di una variabile. Fornisce un output migliore e più chiaro
rispetto alla funzione nativa var_export()
.
Tabella di compatibilità
PhpGenerator 4.1 è compatibile con PHP 8.0 – 8.4.