PHP 8.0 Released

Published by Lello on

In questi giorni, il team di sviluppo di PHP ha rilasciato la nuova major release 8.0 del celebre linguaggio general-purpose, utilizzato principalmente in ambiente web. La sua diffusione è legata principalmente al fatto che la maggior parte (praticamente tutti) i CMS utilizzati su internet per la creazione e manutenzione di siti dinamici, si basano su PHP.


Il PHP 8 contiene diverse nuove funzionalità richieste a più voci dalla community: i named arguments, la definizione dei tipi unione, gli attributi, gli attributi, la promozione a proprietà degli argomenti del costruttore, l’espressione match, l’operatore nullsafe, la compilazione JIT e miglioramenti al sistema dei tipi, alla gestione degli errori e alla consistenza. Vediamo brevemente alcune di queste feature.

Named arguments:

Gli argomenti con nome consentono di passare argomenti a una funzione in base al nome del parametro, piuttosto che alla posizione del parametro. Ciò rende il significato dell’argomento auto-documentante, rende gli argomenti indipendenti dall’ordine e consente di saltare arbitrariamente i valori predefiniti. Per fare un semplice esempio:

// Utilizzo di argomenti posizionali:
array_fill ( 0 , 100 , 50 ) ;

// Utilizzo di argomenti denominati:
array_fill ( start_index : 0 , num : 100 , valore : 50 ) ;

L’ordine in cui vengono passati gli argomenti con nome non ha importanza. L’esempio precedente li passa nello stesso ordine in cui sono dichiarati nella firma della funzione, ma è possibile anche qualsiasi altro ordine.

Attributi

Gli attributi consentono di aggiungere informazioni di metadati strutturati per le dichiarazioni di classi, proprietà, funzioni, metodi, parametri e costanti. Gli attributi potrebbero quindi essere pensati come un linguaggio di configurazione incorporato direttamente nel codice.

Concetti simili esistono in altri linguaggi: Annotations in Java, Attributes in C #, C ++, Rust, Hack e Decorators in Python e Javascript.

Gli attributi possono essere dunque applicati a:

  • funzioni (comprese chiusure e chiusure brevi)
  • classi (comprese classi anonime), interfacce, tratti
  • costanti di classe
  • proprietà di classe
  • metodi di classe
  • parametri di funzione / metodo

Ad esempio:

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

Lo stesso nome di attributo può essere utilizzato più di una volta nella stessa dichiarazione.

Promozione a proprietà degli argomenti del costruttore

I parametri del costruttore possono anche essere promossi in modo che corrispondano a una proprietà dell’oggetto. Attualmente, la definizione di oggetti valore semplici richiede molto testo, perché tutte le proprietà devono essere ripetute almeno quattro volte. La promozione del costruttore fornisce una scorciatoia.

Considera la seguente semplice classe:

class Point {
   public float $ x ;
   public float $ y ;
   public float $ z ;

   funzione pubblica __construct (
     float $ x = 0.0 ,
     float $ y = 0.0 ,
     float $ z = 0.0 ,
   ) {
     $ this -> x = $ x ;
     $ questo -> y = $ y ;
     $ questo -> z = $ z ;
  }
}

Nell’esempio precedente, le proprietà vengono ripetute nella dichiarazione della proprietà, nei parametri del costruttore e  due volte nell’assegnazione della proprietà. Inoltre, il tipo di proprietà viene ripetuto due volte.

Grazie alla promozione dei costruttori, il codice può essere così riscritto:

class Point {
   public function __construct (
   public float $ x = 0.0 ,
   public float $ y = 0.0 ,
   public float $ z = 0.0 ,
) { }
}
Tipi di unione

Una dichiarazione di  “tipo di unione” accetta valori di più tipi diversi, anziché uno solo; sono specificati utilizzando la sintassi T1|T2|…. Il tipo null è supportato come parte delle unioni in modo tale che T1|T2|null possa essere considerato un’unione nullable.

I tipi di unione supportano tutti i tipi attualmente supportati da PHP, con alcune eccezioni.

Espressione match

L’espressione match è simile ad un’istruzione switch ma presenta alcune differenze fondamentali:

  • Match è un’espressione (restituisce un valore), ovvero il suo risultato può essere salvato in una variabile o ritornato;
  • I rami del match supportano solo espressioni a singola linea e non necessitano di un’espressione break;
  • Match esegue comparazioni strict  ( ===) invece che liberamente (==) come fa l’istruzione switch;
$return_value match (subject_expression) {
    single_conditional_expression => return_expression,
    conditional_expression1conditional_expression2 => return_expression,
};
Operatore nullsafe

Invece di controllare la presenza di un null, ora si può usare una catena di chiamate con il nuovo operatore nullsafe. Quando la valutazione di un elemento della catena fallisce, l’esecuzione della catena si interrompe e l’intera catena restituisce il valore null.

$country = $session?->user?->getAddress()?->country;

Per scrivere lo stesso tipo di codice in PHP 7:

$country = null;

if ($session !== null) {
   $user = $session->user;
   if ($user !== null) {
      $address = $user->getAddress();
      if ($address !== null) {
         $country = $address->country;
      }
   }
}
Compilazione Just-In-Time

PHP 8 intrduce due motori di compilazione JIT: Tracing JIT e Function JIT. Tracing JIT (il più promettente dei due), mostra delle prestazioni 3 volte superiori nei benchmarks sintetici e 1.5–2 volte superiori per alcuni specifici processi applicativi a lunga esecuzione. Le prestazioni delle tipiche applicazioni web sono al pari con PHP 7.4.

 

Queste sono solo alcune delle principali novità e dei cambiamenti introdotti in questa major release del PHP 8.0. Se volete conoscere tutte le novità introdotte, potete collegarvi a questa pagina; potete scaircare la nuova versione da questa pagina.