match: il switch che avresti sempre voluto avere
Niente type coercion, niente fallthrough, valore di ritorno, esaustività
Chi ha scritto un switch conosce i suoi tre difetti classici: confronta con == (loose, piena di sorprese), se dimentichi un break l'esecuzione scivola nel caso successivo, e non produce direttamente un valore, devi assegnarlo dentro ogni case. Da PHP 8.0 esiste match: stesso spirito, tre difetti risolti in un colpo solo.
1. Niente conversione di tipo: confronto sempre rigoroso
Il manuale è chiaro: ogni «arm» di match confronta il valore con uguaglianza stretta (===), indipendentemente da strict_types. Non serve attivare nulla: match è sempre rigoroso, anche nei file senza declare(strict_types=1).
function leggi(mixed $valore): string
{
return match ($valore) {
1 => 'Intero 1',
'1' => 'Stringa 1',
true => 'Booleano true',
};
}
leggi(1);
// 'Intero 1'
leggi('1');
// 'Stringa 1'
// Con switch, 1 e '1' si sarebbero confusi
leggi(true);
// 'Booleano true'
2. Niente fallthrough: si ferma da solo
Con switch, dimenticare un break fa proseguire l'esecuzione nel case seguente, una fonte di bug così comune da avere un nome proprio, «fallthrough». Con match il problema non esiste: ogni arm si ferma da sé, senza bisogno di break. In compenso puoi raggruppare più condizioni sulla stessa riga separandole con una virgola.
$giorno = 3;
$tipo = match ($giorno) {
1, 2, 3, 4, 5 => 'Feriale',
6, 7 => 'Weekend',
};
// 'Feriale'
// Nessun break necessario e nessun rischio di "scivolare" oltre
3. match è un'espressione: restituisce sempre un valore
Qui sta il cambio di mentalità più importante: switch è un'istruzione (esegue codice), match è un'espressione (produce un valore). Niente più variabile dichiarata «a mano» dentro ogni ramo e poi letta fuori.
// PRIMA: con switch è facile dimenticare di assegnare $y in un case
switch ($x) {
case 0:
$y = 'Zero';
break;
case 1:
$y = 'Uno';
break;
}
echo $y;
// DOPO: con match, il valore è il risultato stesso dell'espressione
echo match ($x) {
0 => 'Zero',
1 => 'Uno',
};
4. Esaustività: se non gestisci un caso, PHP te lo dice
Un'espressione match deve gestire il valore che riceve. Se nessun arm corrisponde e non c'è un default, PHP lancia un \UnhandledMatchError, invece di proseguire in silenzio con un risultato sbagliato o mancante, come farebbe uno switch senza default.
$statusCode = 500;
$messaggio = match ($statusCode) {
200 => 'OK',
404 => 'Non trovato',
};
// UnhandledMatchError:
// Unhandled match case 500
Bonus utile: usando true come soggetto, match gestisce anche condizioni «a intervallo», non solo identità puntuali:
$eta = 23;
$fascia = match (true) {
$eta >= 65 => 'senior',
$eta >= 25 => 'adulto',
$eta >= 18 => 'giovane adulto',
default => 'minore',
};
// 'giovane adulto'
In sintesi
| switch | match | |
|---|---|---|
| Confronto | == (debole, con sorprese) | === (rigoroso, sempre) |
| Fallthrough | Sì, serve break per fermarlo | Mai: si ferma da solo |
| Valore | Istruzione: va assegnato a mano | Espressione: lo restituisce lui |
| Casi mancanti | Prosegue in silenzio | UnhandledMatchError |
match non è solo «uno switch più corto»: è un costrutto pensato per far emergere subito gli errori che uno switch lascerebbe passare silenziosi. Dove puoi, preferiscilo, specie per mappare valori e restituire risultati.
Commenti (0)
Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).
Nessun commento. Sii il primo a scrivere qualcosa.