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.