A fine novembre 2019 verrà rilasciata ufficialmente la versione 7.4 di PHP. Nell'aggiornamento sono presenti diverse novità che vale la pena approfondire. Scopriamo insieme quali sono.
Typed properties
Finalmente anche per le proprietà di una classe è possibile definire il tipo, confermando il lavoro che da anni si sta facendo verso un linguaggio più tipizzato. Abbiamo trattato l'argomento in un articolo ad esso dedicato: PHP 7.4 e Typed properties.
Analizziamo però un esempio:
class Book
{
public string $title;
public string $isbn;
public \DateTime $publicationDate;
public float $price;
..
}
Quello che succede assegnando un tipo di dato diverso da quello che ci aspettiamo per una proprietà è un Fatal error:
$book->price = 'ten dollars';
Fatal error: Uncaught TypeError: Typed property Book::$price must be float, string used..
Arrow functions
Chi utilizza Javascript avrà notato la comodità delle arrow function. Dalla release 7.4 anche PHP le prevede, con una sintassi non molto diversa da quella di Javascript:
fn($book) => $book->title;
Vediamo anche un esempio all'interno di un \array_map
per capirne i vantaggi.
// PHP <= 7.3
$bookTitles = \array_map(function($book) {
return $book->title;
}, $books);
// PHP 7.4
$bookTitle => \array_map(fn($book) => $book->title, $books);
Possiamo notare che, oltre ad aver scritto un po' meno codice, è la leggibilità che ne trae molto vantaggio.
Ricordiamoci sempre che all'interno di una arrow function è necessario utilizzare una sola istruzione e non deve mai contenere la keyword return
.
Unpacking all'interno di array
Nelle precedenti versioni è stato già introdotto lo spread operator ...
con cui scompattare un array ed "appiattirlo". Dalla versione 7.4 è possibile utilizzarlo anche all'interno della dichiarazione di un array. Vediamo un esempio:
$numbers = [1, 2, 3];
$moreNumbers = [4, ...$numbers, 5, 6];
array(6) {
[0]=>
int(4)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(5)
[5]=>
int(6)
}
Null Coalescing Assignment Operator
Il null coalescing assignment operator è uno shorthand che combina due check: l'isset()
per verificare che una chiave all'interno dell'array esista ed un operatore ternario. Già con PHP 7.0 qualcosa era stato introdotto, con la nuova versione è stato migliorato ulteriormente.
Vediamo qualche esempio:
// PHP < 7
$book['name'] = isset($book['name']) ? $book['name'] : 'no title';
// PHP >= 7.0
$book['name']= $book['name'] ?? 'no title';
// PHP 7.4
$book['name'] ??= 'no title';
Funzionalità deprecate
Oltre alle novità che abbiamo appena introdotto, ci sono delle importanti deprecazioni che bisogna tenere a mente durante lo sviluppo.
Operatori ternari annidati senza parentesi
Per migliorare la leggibilità del codice sono stati deprecati gli operatori ternari annidati senza l';utilizzo di parentesi.
// Non OK (deprecato)
$value = $a ? $b : $c ? $d : $e;
// OK
$value = ( $a ? $b : $c ) ? $d : $e;
// OK
$value = $a ? $b : ( $c ? $d : $e );
Utilizzo di \array_key_exists()
per gli oggetti
Non è una pratica molto diffusa ma si poteva utilizzare \array_key_exists()
anche per verificare che una classe contenesse o meno una determinata proprietà. La versione PHP 7.4 ha deprecato questa tecnica consigliando l'utlizzo di \property_exists()
o, più semplicemente, di una \isset()
.
Accesso alle chiavi di un array attraverso le parentesi graffe
Anche questa non è una tecnica particolarmente diffusa e consiste nell'accedere agli indici di un array tramite parentesi graffe anziché quadre. Anche in questo caso è stata deprecata.
// NON OK (deprecato)
$array{ $key };
// OK
$array[ $key ];