PHP e le strutture di controllo: usare il costrutto <strong>match</strong> per scrivere condizioni più chiare

by theArchitect
SHARE
PHP e le strutture di controllo: usare il costrutto <strong>match</strong> per scrivere condizioni più chiare
© Guida-HTML5.it

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

SHARE