Il WordCamp Torino 2018 è purtroppo già alle spalle. E’ stato un altro bellissimo incontro della community italiana di WordPress. Ho potuto partecipare come speaker ed ho parlato di PHP 7. Spero di essere riuscito a sottolineare i vantaggi dell’upgrade a una versione dell’interprete più recente. Non ho puntato soltanto sul solito aspetto della performance (anche se non potevo non toccare questo argomento), ma volevo pubblicizzare in particolare le novità della lingua di programmazione stessa. Soprattutto se hanno una certa influenza sul modo in cui sviluppiamo i nostri progetti futuri.
Il concetto e la sfida
Ho già fatto un intervento simile presso MotorK – l’azienda in cui lavoro come team leader e head of PHP. Con il titolo “PHP – Ready for version 7” ho avuto un pubblico formato quasi esclusivamente da sviluppatori. La sessione è durata 30 minuti e circa l’80 % delle slide conteneva codice.
Purtroppo, per il WordCamp Torino 2018, ho avuto a disposizione solo uno slot da 10 minuti per un Lightning Talk che mi ha posto davanti alla sfida di come ridurre in così poco tempo il concetto dello speech già preparato – una sfida non semplicissima.
Ripensare al modo della presentazione
Durante l’intervento presso MotorK ho presentato circa 25 nuove feature come un viaggio che partiva con PHP 5.2 e finiva con PHP 7.2. Scrivo di proposito “circa” perché ho parlato anche delle piccole novità come Nullcoalescing Operator, introdotto come zucchero sintattico puro nelle Features di PHP 7.
Mi sono limitato a 18 slide che mi sembravano un numero ragionevole per 10 minuti di tempo. In questo modo potevo comodamente presentare una Top 10 dei nuovi elementi della lingua di programmazione. Chissà? Magari riprenderò questa tematica al WordCamp Bologna 2018 è potrò essere un po’ più esauriente.
Perché si parte dalla versione 5.2 di PHP?
Nell’estate del 2010, Mark Jaquith ha scritto che gli sviluppatori del WordPress Core si sono accordati decidendo di smettere di supportare PHP 4 e hanno impostato PHP 5.2 come versione minimale. La giustificazione di questa decisione è stata che anche gli sviluppatori dei progetti Drupal e Joomla avevano deciso così. Ma se anche evitiamo di chiederci se sia giusto o sbagliato:
Il supporto ufficiale per PHP 5.2 è terminato nel gennaio del 2011.
Con la versione PHP 5.3 da minimale bisognava probabilmente fare subito il conto con un paio di problemi con MySQL. Ma alla fine:
PHP 5.2 è ancora oggi la versione minimale supportata da WordPress.
La mia Top 10 delle nuove feature di PHP
Per la selezione è stato importante che le nuove feature avessero veramente un impatto e cambiassero prima o poi il modo in cui scriviamo il nostro codice. Concentrandomi su questo tipo di elementi ed escludendo (se possibile) spiegazioni sulle incompatibilità, il mio obiettivo è stimolare la voglia di scoprire e sperimentare.
A questo punto voglio richiamare l’attenzione sulle appendici della documentazione che sono piuttosto stimolanti se [come me] avete voglia di imbattervi in questo tipo di scoperta.
Ecco finalmente la mia Top 10 delle “New Features”:
1. Namespaces
Con PHP 5.3 sono stati introdotti i Namespaces. Il concetto è abbastanza semplice da capire e dovrebbe essere di altissimo interesse soprattutto per lo sviluppo di plugin. Prima dell’introduzione di questa feature, eravamo costretti a creare nomi lunghi per le funzioni e per la classe per evitare le collisioni con l’API di WordPress. Adesso è sufficiente creare i propri Namespaces e il mal di testa dovuto alla creazione di nomi è solo un lontano ricordo.
Per capire il concetto:
Immaginiamo un harddisc dove i nostri file possono avere soltanto un nome uguale se sono in cartelle diverse.
2. Type declaration
Il Type hinting era stato già introdotto con PHP 5.2. Finalmente era possibile definire, per gli argomenti delle funzioni e dei metodi, se il tipo doveva essere un array o un oggetto di una istanza di classe o di un’interfaccia ben precisa.
A partire da PHP 5.4 è possibile dichiarare il tipo callable per i callback. La dichiarazione dei tipi è finalmente completa da PHP 7.0. Da questa versione si può finalmente dichiarare integer, string, float e boolean per gli argomenti. PHP 7.1 ha introdotto il tipo iterable il quale accetta array o instance di Traversable.
PHP 7.2 introduce poi il tipo object.
3. Return type declaration
Per completare la feature della dichiarazione dei tipi, a partire da PHP 7.0, c’è anche la possibilità di fissare il tipo del return value. In aggiunta ai tipi per gli argomenti, da PHP 7.1 è possibile dichiarare void come tipo quando non torna nessun valore da una function o da un metodo.
Ci sono poi altre 2 novità che valgono anche per la feature della type declaration. Si può dichiarare la modalità strict cambiando così il comportamento standard di PHP con gli string numerici, cosa coerente per l’andamento dello sviluppo di questa feature. Dalla versione 7.1 di PHP abbiamo in più la possibilità di segnalare con nullable che accettiamo il tipo dichiarato o null.
4. Late Static Bindings
A partire da PHP 5.3, PHP implementa la feature Late Static Bindings. Per spiegare come funziona propongo il codice seguente. Il parent-class Post ha un metodo statico init che si ritrova spesso in WordPress: un factory-method crea un oggetto e mette dei callback con add_action– o add_filter nella queue per richiamare poi l’oggetto.
L’esempio è ovviamente molto semplificato ma si può notare che, invece di usare self, ho usato la parola chiave static. L’uso di questa parola ci dà non più un’istanza della classe parent ma un’istanza della classe figlio, a partire dalla quale abbiamo chiamato il metodo.
5. Closures
In WordPress vediamo le funzioni callback dappertutto. Da questo punto di vista conosciamo già le esigenze. Tutti quelli che conoscono Javascript moderno vedono le funzioni anonyme o Closures che sono arrivate con PHP 5.3 come costruzione immancabile.
Nello sviluppo per WordPress c’è spesso l’uso delle Closures insieme a diversi hook. Hanno un aspetto elegante e si sente spesso che un autore di un plugin non vuole che si rimuova una callback importante. Ma questo è anche un chiaro sintomo della problematica.
6. Errori ed eccezioni in PHP 7
I blocchi try e catch purtroppo non si vedono così spesso nel mondo WordPress. Con le versioni più moderne del nostro interprete le cose magari cambiano. Le già esistenti Exceptions adesso si trovano unite con le nuove classi Error sotto l’interfaccia Trowable.
Nel passato si doveva semplicemente fare pace con il fatto che un Fatal Error faceva finire immediatamente l’esecuzione di uno script PHP. Adesso è possibile catturare anche questi errori.
7. Generator
I Generator sono, a partire da PHP 5.5, un modo semplice per creare un Iterator senza dover implementare tutta l’interfaccia. Quando si crea un loop con foreach, per esempio, se abbiamo a che fare con grandi quantità di dati, dobbiamo considerare che anche la quantità della memoria di cui avremo bisogno sarà altrettanto grande.
Un Generator si crea con una funzione che non restituisce valori con la parola chiave return. Dovrebbe invece farli tornare tramite la parola chiave yield. Richiamando una funzione di questo tipo si riceve senza limite impostato il valore attuale dell’iterazione. La memoria in uso è più meno o 1 kb, giusto lo spazio per la copia dell’oggetto nella RAM.
8. Trait
Normalmente è possibile estendere esattamente una classe a partire da un’altra classe e così ereditarne le proprietà. Dalla versione PHP 5.4, con i Trait si può ottenere una pseudo ereditarietà multipla e, anche se questo meccanismo sembra più una specie di mixin, con questa nuova feature si possono fare un paio di cose utili.
Possiamo per esempio aggiungere un logger a una classe piuttosto velocemente e senza problemi. Una classe può utilizzare anche più di un Trait. Si possono cambiare anche i nomi dei metodi e la loro visibilità.
9. Splat operator in PHP 5.6
Lo Splat Operator (anche Scatter Operator) con i 3 punti viene usato per la nuova feature Variadic Functions ma anche per la controparte Argument Unpacking. Quando nella firma di una funzione o di un metodo si usano 3 punti prima della variabile, possiamo passare una quantità indeterminata di parametri. Con il Type Hinting è possibile anche definire di che tipo i parametri devono essere.
Complementarmente a tutto questo possiamo dare alle funzioni che accettano una quantità indeterminata di argomenti semplicemente un array aggiungendo i 3 punti dell’operatore. Giusto il tempo di ambientarsi un po’ e si può anche approfittare di una migliore leggibilità.
10. Abstract + Interface method widening
Con PHP 7.2 sono arrivate 2 novità veramente interessanti e che sono in parte controverse. Abstract class astratte – se estendono altre classi astratte – ora non devono necessariamente avere il tipo di argomento definito. Questo non cambia però il fatto che l’interprete si aspetta il tipo definito nella parent class. Inoltre possiamo aggiungere un return type ai metodi astratti in mancanza di un tipo definito.
Se si fa la stessa cosa con un Interface, se non scriviamo il tipo di parametro, possiamo passare qualsiasi tipo di valore. Non si può però cambiare il return type perché questo deve garantirlo l’interfaccia.
L’imbarazzo doi scelta e il resto
Credo che la toplist delle nuove feature di PHP mi sia in qualche modo riuscita. Mancano ovviamente una serie di cose interessantissime che non potevano trovare posto qui, insieme a una quantità enorme di nuove funzioni della lingua.
Sono però convinto che sia più che chiara la tendenza di PHP a diventare un linguaggio di programmazione sempre più maturo.
Ho messo le feature più importanti in un repository (come ho scritto all’inizio): New features in PHP 5.3, 5.4, 5.5, 5.6, 7.0, 7.1 e 7.2.
E… con il 23 marzo 2018 si è concluso il ciclo di vita di PHP 5.4 e PHP 5.5. La stessa sorte spetterà a PHP 5.6 e PHP 7.0 alla fine di quest’anno.