Atteso per la fine di novembre 2019, PHP 7.4 ha in serbo nuove funzionalità, alcune deprecazioni e miglioramenti nelle prestazioni.
In questo articolo vedremo una panoramica delle funzionalità e delle modifiche più interessanti.
L'elenco completo è consultabile a questo indirizzo https://wiki.php.net/rfc#php_74.
Partiamo dalle novità riguardanti funzionalità e prestazioni.
Indice dei contenuti
Questa funzionalità doveva essere rilasciata con l'uscita di PHP 7.1, ma non passò il voto di approvazione del team di sviluppo.
Conosciute anche come arrow functions, le short closures consentono di scrivere funzioni anonime in PHP in maniera più leggibile. La loro utilità viene mostrata nelle funzioni PHP array_map
o array_filter
. Prendiamo il seguente codice di esempio
<?php
array_map(function (User $user) {
return $user->name;
}, $users)
Con le short closured possiamo scrivere
<?php
array_map(fn(User $user) => $user->name, $users)
Abbiamo usato la parola chiave fn
che prende come argomento il parametro passato alla funzione anonima. L'operatore =>
consente di ritornare il valore della funzione.
In breve le short closures:
fn
return
Per approfondire leggi la RFC https://wiki.php.net/rfc/arrow_functions_v2.
Con la gestione dei tipi di dati in ingresso e in uscita per le funzioni introdotta con l'uscita di PHP 7, il linguaggio ha aumentato la sua robustezza. Tuttavia al momento manca il supporto dei tipi per le proprietà di una classe. Il Typed properties (tipizzazione delle proprietà) introduce questa possibilità.
Sarà possibile riscrivere il seguente codice
<?php
class User
{
private $id;
private $name;
public function __construct(int $id, string $name)
{
$this->id = $id;
$this->name = $name;
}
public function getId(): int
{
return $this->id;
}
public function setId(int $id): void
{
$this->id = $id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
in questo modo
<?php
class User
{
public int $id;
public string $name;
public function __construct(int $id, string $name)
{
$this->id = $id;
$this->name = $name;
}
}
Per approfondire leggi la RFC https://wiki.php.net/rfc/typed_properties_v2.
L'operatore null coalesce è un'operatore di confronto, introdotto con PHP 7, utile ad assegnare valori di default alle variabili. Con la versione 7.4 sarà possibile utilizzare la forma contratta dell'operatore, dando di fatto la possibilità di trasformarlo in un operatore di assegnazione.
Il codice seguente
<?php
$user['age'] = $user['age'] ?? '18';
potrà essere scritto in questo modo
<?php
$user['age'] ??= '18';
Per approfondire leggi la RFC https://wiki.php.net/rfc/null_coalesce_equal_operator.
Introdotto in PHP 5.6, l'operatore spread (o splat operator) consente di specificare un numero di parametri indefinito per le funzioni attraverso la sintassi ...
(3 puntini). Con la nuova versione sarà consentito applicare l'operatore spread anche agli array, come mostra il seguente esempio
<?php
$fruits1 = ['mela', 'pera'];
$fruits2 = ['banana', 'arancia', ...$fruits1, 'melone'];
// ['banana', 'arancia', 'mela', 'pera', 'melone'];
Per approfondire leggi la RFC https://wiki.php.net/rfc/spread_operator_for_array.
Foreign Function Interface (FFI) è una sorta di API che consente di interfacciarsi con le librerie in C, direttamente dai propri script PHP. In pratica FFI è un modo per richiamare tramite puro codice PHP, le librerie scritte in linguaggio C.
Per approfondire leggi la RFC https://wiki.php.net/rfc/ffi.
Il preloading (letteralmente precaricamento) è una modifica che riguarda il miglioramento delle performance.
Se stai usando un framework, i suoi file devono essere caricati e ricompilati ad ogni richiesta. Il precaricamento consente al server di caricare script PHP in memoria all'avvio e di renderli permanentemente disponibili per tutte le richieste successive.
Sarà possibile abilitare il preloading tramite la direttiva opcache.preload
del file di configurazione di PHP.
Per approfondire leggi la RFC https://wiki.php.net/rfc/preload.
Questa funzionalità consentirà la separazione di gruppi di cifre lunghi, dando maggiore leggibilità al codice. Il carattere di separazione è l'underscore _
.
Riassumendo con un esempio, sarà possibile scrivere
<?php
$time = 10000000000 - 9644473600; // senza separatore
$time = 10_000_000_000 - 9_644_473_600; // con separatore
Al momento PHP supporta due meccanismi di serializzazione personalizzata degli oggetti:
__sleep()
e __wakeup()
.Serializable
.A partire dalla nuova versione verranno aggiunti due nuovi metodi magici, __serialize()
e __unserialize()
, con lo scopo di migliorare il meccanismo di serializzazione attuale.
Infatti a detta di Nikita Popov, ossia colui che ha proposto la RFC, ciò dovrebbe risolvere alcuni problemi che si presentano con i due meccanismi esistenti.
Per approfondire leggi la RFC https://wiki.php.net/rfc/custom_object_serialization
Le deprecazioni in un linguaggio di programmazione vengono mostrare come notifiche allo sviluppatore, avvisandolo che la funzionalità verrà rimossa o modificata nelle versioni successive. Dunque è bene non ignorare questi avvisi e correggerli immediatamente.
Il tag aperto breve <?
sarà deprecato e verrà rimosso in PHP 8.0. La RFC https://wiki.php.net/rfc/deprecate_php_short_tags
Gli operatori ternari nidificati in PHP hanno un comportamento strano rispetto ad altri linguaggi, dovuto al fatto che vengono interpretati con associazione a sinistra.
Al momento il seguente snippet codice:
return $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other';
Equivale a questo:
return ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other';
A partire da PHP 7.4, la mancanza delle parentesi tonde nell'uso di operatori ternari nidificati, genererà un avviso di deprecazione. Da PHP 8.0 diventerrà obbligatorio il loro uso per evitare errori.
Di seguito un elenco di ulteriori modifiche che riguardano sia il linguaggio che il sistema di votazione delle RFC.
Nuova funzione mb_str_split
, che svolge lo stesso compito di str_split
, aggiungendo il supporto multi-byte.
La funzione strip_tags()
ora accetta anche un array dei tag consentiti: invece di
strip_tags($str, '<a><p>')
è possibile scrivere
strip_tags($str, ['a', 'p']).
Da segnalare la modifica del meccanismo di votazione delle RFC, le quali d'ora in poi dovranno: