PHP versione 8 in arrivo: tutte le novità

Pubblicità

Stando alla pianificazione ufficiale diffusa nel sito PHP.net, la versione 8 del linguaggio per il web più utilizzato e popolare al mondo dovrebbe andare in release pubblica a dicembre 2020; in questa data, infatti, dovrebbe vedere la luce la prima versione stable. Di conseguenza, ci si aspetta che i vari servizi di hosting vadano ad adeguarsi alla nuova versione del linguaggio già verso la metà del prossimo anno.

PHP 8 è anche oggetto di un talk di Sebstian Bergmann, che entra nel merito con dettagli tecnici e performativi rispetto a questa nuova ed attesissima versione del linguaggio. Tra le novità più attese, l’introduzione di nuove interfacce e funzioni per il DOM PHP, l’introduzione di nuove funzioni di pattern matching e debug, l’uso del compilatore JIT di default, attributi per le variabili e nuovi tipi di costruttori per le classi.

Compilatore Just In Time (JIT)

Le novità di PHP 8 passano anzitutto per l’introduzione e consolidamento di un compilatore Just-In-Time, che era già disponibile dalla versione 7.4 del linguaggio (e che ho già sperimentato con successo nell’ambito dell’implementazione di OPCache). In genere un compilatore just-in-time (JIT) permette un tipo di compilazione del codice scritto in PHP più veloce e performante, in  quanto viene ridotto notevolmente il tempo necessario per l’esecuzione degli script e la generazione di un bytecode più veloce da eseguire rispetto al caso ordinario.

Con la versione PHP 8 tutto questo farà un ulteriore passo avanti, per quando (stando alle specifiche ufficiali) non è detto che WordPress e CMS simili scritti in PHP ne riescano ad usufruire facilmente. I test di benchmark sul JIT, di fatto, sono effettuati e apprezzabili soltanto nel caso in cui il codice venga sfruttato per la generazione di frattali, o comunque per sfruttare determinate caratteristiche del linguaggio PHP che non sempre, lato web, vengono utilizzate.

Sulla sinistra, in questo esempio (fonte) è possibile vedere una generazione di frattali con PHP standard, più lenta e “a scatti”, mentre a destra si può vedere l’elaborazione più fluida ottenibile con l’integrazione di un compilatore JIT.

Una novità che, a conti fatti, rischia un po’ di essere un uovo di colombo (quel benchmarch è visualmente efficace ma difficile da applicare nella pratica dei siti web, alla fine), senza contare che per gli informatici non è nemmeno una novità colossale (la modalità JIT esisteva già su vari linguaggi e framework da anni, e non sarà certo una salvezza per chi poi dovrà effettuare debug e manutenzione del codice). Porta sicuramente vantaggi interessanti in potenziale, ma il rischio è che la corsa all’aggiornamento si riveli più problematica che altro.

Pattern matching ottimizzato

Chiunque debba effettuare la ricerca di un pattern in una stringa sa bene quanto l’operazione, formalmente semplice sulla carta, possa rivelarsi complessa all’atto pratico. Storicamente il pattern matching tra stringhe si può effettuare mediante regex (espressioni regolari) oppure mediante strpos, che pero’ ha una sintassi francamente un po’ ostica da comprendere e ricordare.

PHP 8 ha introdotto una nuova funzione:

str_contains ( $ago, $pagliaio ) 

che restituisce true o false se la stringa $ago è contenuta nel $pagliaio. Per cercare all’inizio e solo alla fine di una stringa, similmente, sono introdotte le funzioni:

str_starts_with ( $ago, $pagliaio )
 str_ends_with( $ago, $pagliaio ) 

che restituiscono sempre un valore boolean true o false.

Constructor Property Promotion

Questa feature permette al programmatore PHP di risparmiarsi righe di codice, inserendo direttamente le proprietà da modificare (campi di variabili private) all’interno del costruttore della classe, per cui una classe del genere, vagamente ridondante nella sua definizione:

class LaMiaClasse
{
    public string $nome;

    public function __construct(
        string $nome = 'Pippo'
    ) {
        $this->nome = $nome;
    }
}

sarà equivalente alla nuova sintassi compatta:

class LaMiaClasse
{
    public function __construct(
        public string $nome = 'Pippo',
    ) {}
}

Attributi v2

A partire dalla versione 8 di PHP, saranno disponibili gli attributi per le variabili, da inserire nel codice nella forma:

<<attributo>>

Debug: throw e rilevazione in real time del tipo di una variabile

Storicamente il tipo di una variabile PHP poteva essere rilevato a runtime mediante instanceof:

if ( ($x instanceof Foo) ) { 
	// se $x è un oggetto di tipo Foo, fai robe...
}

con PHP 8 si può usare in combinazione con la nuova funzione get_debug_type:

if ( !($x get_debug_type Foo) ) {

// se $x NON è un oggetto di tipo Foo

echo "oggetto x di tipo: ". get_debug_type($x); }

Sempre a livello di debug, con PHP 8 è possibile usare la funzione throw in modo più autonomo, come se fosse una funzione stand alone, e non solo in caso di specifiche Exception.

Uso dei trait con firma digitale

Si propone un uso più uniforme dei trait PHP, sfruttando le indicazioni di un nuovo RFC che esprime la necessità di firmare digitalmente le chiamate ad un metodo contenuto in un trait, lanciando eventualmente un’eccezione specifica in caso di violazioni.

Uso delle interface con firma digitale

Si fa un discorso simile a quello visto per i trait, solo che qui varrà per le interfacce (interface) delle classi.

Indici negativi consecutivi

Viene inserito by default il fatto che se inizializzo un array con indice negativi, i successivi indici utilizzati – ad esempio in caso di uso della funzione push() – possano essere sfruttati non più a partire da 0, bensì dai numeri successivi. AD esempio se inserisco un elemento in posizione -7, gli altri inserimenti saranno in corrispondenza di -6, -5 e -4.

array(4) {
	[-7]=>
	'PHP'
	[-6]=>
	'versio 8'
	[-5]=>
	'cambierà'
	[-4]=>
	'molte cose'
}

Union Types

PHP 8 supporterà gli Union Types, ovvero le variabili o i record che possono assumere uno o più tipi (ad esempio float o integer), consentendo così una maggiore flessibilità in fase di programmazione.

Ulteriori novità

Sono previsti infine un supporto migliorato per le weak maps, nuova sintassi ::class ammessa nel linguaggio, errori di tipo ottimizzati, possibilità di concludere l’elenco di parametri di una funzione con una virgola. (fonte: wiki.php.net)

1 voto