Blog PHP

PHP 7.4: le novità del linguaggio

Cosa c'è di nuovo in PHP 7.4?

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.

Short closures

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:

  • Iniziano con la parola chiave  fn
  • Possono contenere solamente un'istruzione, ovvero quella di ritorno
  • Non è consentito l'uso dell'istruzione return
  • È consentito usare l'operatore di spread
  • Può essere specificato il tipo di dati sia per gli argomenti che per il valore di ritorno

Per approfondire leggi la RFC https://wiki.php.net/rfc/arrow_functions_v2.

Typed properties

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.

Operatore di assegnazione null coalesce

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.

Operatore spread per gli array

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

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.

Preloading

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.

Numeric Literal Separator

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

Custom object serialization

Al momento PHP supporta due meccanismi di serializzazione personalizzata degli oggetti:

  • Tramite i metodi magici __sleep() e __wakeup().
  • Tramite l'interfaccia 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

Deprecazioni

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.

Tag di apertura breve deprecato

Il tag aperto breve <? sarà deprecato e verrà rimosso in PHP 8.0. La RFC https://wiki.php.net/rfc/deprecate_php_short_tags

Deprecazione dell'operatore ternario con associazione a sinistra

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.

Varie

Di seguito un elenco di ulteriori modifiche che riguardano sia il linguaggio che il sistema di votazione delle RFC.

Funzione mb_str_split

Nuova funzione mb_str_split, che svolge lo stesso compito di str_split, aggiungendo il supporto multi-byte.

Novità per la funzione strip_tags

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']).

Votazione delle RFC

Da segnalare la modifica del meccanismo di votazione delle RFC, le quali d'ora in poi:

  • Dovranno avere la maggioranza di almeno 2/3 dei votanti totali.
  • Rimarrano aperte al voto per un minimo di 2 settimane.