Tra le novità di PHP 8, c’è il nuovo match , più potente di switch , potrebbe essere una scelta migliore. Vediamo le differenze tra i due, partendo prima con il classico switch :
switch ($codice_http) { case 200: $messaggio = "OK"; break; case 201: $messaggio = "OK"; break; case 400: $messaggio = "Not found"; break; default: $messaggio = "Stato sconosciuto"; }
Adesso, scriviamolo utilizzando match :
$messaggio = match ($codice_http) { 200, 201 => "OK", 400 => 'Not found', default => 'Stato sconosciuto', };
Per prima cosa notiamo che l’espressione match è molto più breve:
- non richiede break
- può combinare più condizioni utilizzando la virgola
- restituisce un singolo valore, quindi non c’è bisogno di scriverlo ogni volta
Potrebbe essere già abbastanza, ma ci sono altre feature interessanti
Stretta uguaglianza
match esegue un controllo più stretto sul tipo, come avviene per l’operatore === :
$codice_http = '200'; $messaggio = match ($codice_http) { 200 => "OK", default => 'Stato sconosciuto', }; // $messaggio = 'Stato sconosciuto'
Gestione dell’errore
Nel caso non avessimo aggiunto il controllo per un valore e non c’è il default specificato, PHP farà il throw dell’Exception UnhandledMatchError :
$codice_http = 400; $messaggio = match ($codice_http) { 200 => 'OK', }; // UnhandledMatchError
Combinazione di condizioni
Abbiamo già visto la mancanza di break, ma probabilmente la novità più interessante è la possibilità di combinare le condizioni, scrivendo un codice più asciutto:
$messaggio = match ($codice_http) { 200, 300, 301, 302 => 'combined expressions', };
Possibilità di lanciare Exception
Data la modifica a throw in PHP 8, è possibile fare il throw di una Exception direttamente da una condizione:
$messaggio = match ($codice_http) { 200 => null, 500 => throw new ServerError() };
Switch o match?
match è considerabile come la versione moderna di switch a tutti gli effetti. Probabilmente andrà a sostituirla nel corso del tempo, dato che risolve parecchie mancanze ed ha una sintassi più asciutta.