Introduzione
Quando si parla di strutture di controllo in PHP, molti pensano subito a if, else, switch, for e foreach. Sono strumenti fondamentali, ma nelle versioni più recenti di PHP esiste un costrutto molto utile per gestire scelte multiple in modo più leggibile: match.
Il costrutto match è ideale quando devi confrontare un valore con più casi possibili e vuoi evitare blocchi condizionali lunghi, ripetitivi o difficili da mantenere. Rispetto a switch, offre una sintassi più compatta, restituisce direttamente un valore e usa confronti più rigorosi. Questo lo rende perfetto per trasformare dati, assegnare stati, scegliere messaggi o mappare codici in etichette leggibili.
In questo tutorial vedremo un esempio pratico: la gestione dello stato di un ordine in un piccolo sistema e-commerce. Partiremo da un valore numerico o testuale e lo convertiremo in una descrizione chiara da mostrare all’utente o da salvare nei log.
Codice completo
<?php
declare(strict_types=1);
// Simuliamo un ordine con stato salvato nel database
$order = [
´id´ => 1042,
´status´ => ´shipped´,
´total´ => 89.90
];
// Funzione che converte lo stato tecnico in una descrizione leggibile
function getOrderStatusLabel(string $status): string
{
return match ($status) {
´pending´ => ´In attesa di pagamento´,
´paid´ => ´Pagato´,
´processing´ => ´In preparazione´,
´shipped´ => ´Spedito´,
´delivered´ => ´Consegnato´,
´cancelled´ => ´Annullato´,
default => ´Stato sconosciuto´,
};
}
// Funzione che associa uno stato a una classe CSS o a un livello di priorità
function getOrderStatusClass(string $status): string
{
return match ($status) {
´pending´, ´processing´ => ´warning´,
´paid´, ´shipped´ => ´info´,
´delivered´ => ´success´,
´cancelled´ => ´danger´,
default => ´neutral´,
};
}
// Funzione che decide il messaggio operativo da mostrare in base allo stato
function getNextAction(string $status): string
{
return match ($status) {
´pending´ => ´Invia un promemoria di pagamento.´,
´paid´ => ´Prepara il pacco per la spedizione.´,
´processing´ => ´Controlla la disponibilità dei prodotti.´,
´shipped´ => ´Invia il tracking al cliente.´,
´delivered´ => ´Chiedi una recensione.´,
´cancelled´ => ´Archivia l’ordine e aggiorna il magazzino.´,
default => ´Verifica manualmente la situazione.´,
};
}
$statusLabel = getOrderStatusLabel($order[´status´]);
$statusClass = getOrderStatusClass($order[´status´]);
$nextAction = getNextAction($order[´status´]);
echo "Ordine #" . $order[´id´] . PHP_EOL;
echo "Totale: €" . number_format($order[´total´], 2, ´,´, ´.´) . PHP_EOL;
echo "Stato: " . $statusLabel . PHP_EOL;
echo "Classe: " . $statusClass . PHP_EOL;
echo "Azione suggerita: " . $nextAction . PHP_EOL;
// Esempio di gestione di un input non previsto
$unknownStatus = ´returned´;
echo PHP_EOL;
echo "Stato non previsto: " . getOrderStatusLabel($unknownStatus) . PHP_EOL;
echo "Classe associata: " . getOrderStatusClass($unknownStatus) . PHP_EOL;
echo "Azione: " . getNextAction($unknownStatus) . PHP_EOL; Spiegazione
Il costrutto match è stato introdotto per rendere più leggibile la gestione di più condizioni. La sua forma base è semplice:
match ($valore) {
caso1 => risultato1,
caso2 => risultato2,
default => risultato_predefinito,
}; Nel nostro esempio, la variabile $status contiene lo stato dell’ordine. Le funzioni getOrderStatusLabel(), getOrderStatusClass() e getNextAction() usano match per trasformare quello stato in informazioni utili.
1. Valore di ritorno diretto
A differenza di switch, match restituisce un valore. Questo significa che puoi assegnare subito il risultato a una variabile o restituirlo da una funzione senza scrivere blocchi lunghi di codice.
2. Confronto rigoroso
match usa confronti rigorosi, quindi distingue tra valori diversi anche se sembrano simili. Per esempio, ´1´ e 1 non sono trattati come equivalenti. Questo riduce alcuni errori tipici delle condizioni permissive.
3. Più casi per lo stesso risultato
Nel codice abbiamo usato questa forma:
´pending´, ´processing´ => ´warning´, In questo modo due stati diversi producono lo stesso risultato. È molto utile quando vuoi raggruppare casi logici senza duplicare il codice.
4. Il ruolo di default
Il ramo default è importante perché gestisce i casi non previsti. In un’applicazione reale, i dati possono arrivare da database, API o input utente e non sempre sono perfetti. Avere un valore di fallback evita errori e rende il comportamento più prevedibile.
5. Quando usare match al posto di if o switch
Usa match quando devi:
- convertire un valore in un altro valore;
- mappare stati, codici o categorie;
- scrivere condizioni multiple ma compatte;
- evitare blocchi if/elseif/else troppo lunghi;
- rendere il codice più espressivo e facile da leggere.
Non è invece la scelta migliore se devi eseguire molte istruzioni per ogni caso. In quel caso, un if o uno switch tradizionale possono essere più adatti.
Best practice
- Usa match per mappature semplici: è perfetto per trasformare uno stato in un’etichetta, una classe CSS o un messaggio.
- Aggiungi sempre default: gestire i valori inattesi è una buona abitudine, soprattutto in applicazioni che evolvono nel tempo.
- Preferisci nomi chiari per le funzioni: ad esempio getOrderStatusLabel() comunica subito cosa fa.
- Evita logica complessa dentro match: se la regola diventa articolata, spostala in una funzione dedicata.
- Combina match con strict_types: aiuta a mantenere il comportamento del codice più prevedibile.
- Usa valori coerenti: se gli stati arrivano dal database, definisci una convenzione unica come stringhe o costanti di classe.
- Non abusare del costrutto: se la logica richiede effetti collaterali o più operazioni per ramo, meglio scegliere una struttura più esplicita.
Riepilogo
Il costrutto match è una delle strutture di controllo più utili nelle versioni moderne di PHP quando serve gestire molte condizioni in modo pulito. Nel tutorial abbiamo visto come usarlo per:
- convertire uno stato tecnico in un’etichetta leggibile;
- associare uno stato a una classe CSS;
- produrre un’azione consigliata in base alla situazione;
- gestire valori non previsti con default.
Rispetto a una catena lunga di if/elseif, match migliora la leggibilità e rende il codice più facile da mantenere. È una soluzione moderna, elegante e molto pratica per applicazioni reali, soprattutto quando lavori con stati, codici, configurazioni o trasformazioni di dati.
Approfondisci con risorse ufficiali
- Documentazione PHP su match: https://www.php.net/manual/it/control-structures.match.php
- Documentazione PHP sulle strutture di controllo: https://www.php.net/manual/it/language.control-structures.php
- Documentazione PHP su strict_types: https://www.php.net/manual/it/functions.arguments.php#functions.arguments.type-declaration.strict
- Documentazione PHP sulle espressioni: https://www.php.net/manual/it/language.expressions.php
