php Beginner 2 min

match: il switch che avresti sempre voluto avere

Niente type coercion, niente fallthrough, valore di ritorno, esaustività

· 468 parole

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'

Fonte: PHP Manual: «match»: un match arm confronta i valori con uguaglianza stretta (===) invece che in modo debole come switch.

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.

Accedi o registrati per votare, salvare o commentare la pillola

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.

Pillole correlate