W3docs

Istruzione Switch in PHP: Guida Completa

L'istruzione switch in PHP è uno strumento utile per controllare il flusso del codice in un programma, permettendo di testare un'espressione contro più valori.

L'istruzione PHP switch confronta un'espressione con un elenco di possibili valori ed esegue il blocco che corrisponde. È l'alternativa più pulita a una lunga catena di istruzioni if...elseif...else quando si testa la stessa variabile contro molti valori fissi.

Questa pagina tratta la sintassi, come funzionano realmente la corrispondenza e il fall-through, esempi concreti eseguibili, l'alternativa match di PHP 8 e le insidie che causano problemi.

Sintassi

switch (expression) {
    case value1:
        // runs when expression == value1
        break;
    case value2:
        // runs when expression == value2
        break;
    default:
        // runs when nothing above matched
}

L'expression viene valutata una sola volta. Il suo risultato viene poi confrontato, dall'alto verso il basso, con ciascun valore case usando il confronto loose (==). Al primo match, PHP inizia a eseguire le istruzioni da quel case e continua fino a quando incontra un break (o la fine dello switch). Il blocco default opzionale viene eseguito quando nessun case corrisponde — per convenzione viene messo alla fine.

Un esempio funzionante

Questo esempio mappa un numero del giorno a un nome e stampa il risultato:

<?php
$day = 3;

switch ($day) {
    case 1:
        echo "Monday";
        break;
    case 2:
        echo "Tuesday";
        break;
    case 3:
        echo "Wednesday";
        break;
    default:
        echo "Another day";
}
// Output: Wednesday

Poiché $day è 3, il terzo case corrisponde, viene stampato "Wednesday" e break interrompe l'esecuzione prima del blocco default.

Perché break è importante: il fall-through

Se si dimentica un break, l'esecuzione "cade attraverso" nel caso successivo e continua a girare finché non ne trova uno. Questo è il bug più comune con switch:

<?php
$role = "editor";

switch ($role) {
    case "editor":
        echo "Can edit. ";
        // no break — falls through!
    case "viewer":
        echo "Can view.";
        break;
}
// Output: Can edit. Can view.

Qui "editor" ha corrisposto, ma senza break PHP ha eseguito anche il blocco viewer.

Fall-through intenzionale (raggruppamento di case)

Il fall-through è occasionalmente utile di proposito: impilare case vuoti permette a più valori di condividere un blocco.

<?php
$letter = "e";

switch ($letter) {
    case "a":
    case "e":
    case "i":
    case "o":
    case "u":
        echo "Vowel";
        break;
    default:
        echo "Consonant";
}
// Output: Vowel

Switch su una condizione con true

Uno switch può anche sostituire una scala if...elseif per controlli su intervalli. Si fa lo switch su true e si mette un'espressione boolean in ogni case:

<?php
$score = 82;

switch (true) {
    case $score >= 90:
        echo "A";
        break;
    case $score >= 80:
        echo "B";
        break;
    case $score >= 70:
        echo "C";
        break;
    default:
        echo "F";
}
// Output: B

Il primo case la cui espressione è uguale a true vince, quindi l'ordine è importante — elenca prima la condizione più restrittiva.

switch vs match (PHP 8+)

PHP 8 ha aggiunto l'espressione match, un fratello più rigoroso di switch. Usa match quando mappi semplicemente un valore a un risultato:

<?php
$status = 404;

$message = match ($status) {
    200, 201 => "Success",
    404      => "Not Found",
    500      => "Server Error",
    default  => "Unknown",
};

echo $message;
// Output: Not Found

Differenze principali:

switchmatch
Confrontoloose (==)strict (===)
Fall-throughsì (richiede break)nessuno
Restituisce un valorenosì (è un'espressione)
Valore non trovato, nessun defaultnon fa nullalancia UnhandledMatchError

L'insidia del confronto loose

Poiché switch usa ==, un 0 numerico può corrispondere a una stringa non vuota nel vecchio codice. In PHP 8+ le regole di confronto stringa-numero sono state rese più severe, ma mantieni i tipi coerenti per evitare sorprese:

<?php
$value = 0;

switch ($value) {
    case "hello":
        echo "matched hello";
        break;
    default:
        echo "no match";
}
// Output (PHP 8+): no match

In PHP 7, lo stesso codice avrebbe stampato matched hello perché 0 == "hello" era true. In caso di dubbio, usa match per il confronto strict.

Buone pratiche

  • Aggiungi sempre break dopo ogni case a meno che tu non voglia deliberatamente il fall-through (e commentalo quando lo fai).
  • Includi sempre un default per gestire i valori imprevisti invece di non fare nulla silenziosamente.
  • Raggruppa i case correlati impilando etichette case vuote invece di duplicare il codice.
  • Preferisci match (PHP 8+) quando stai restituendo un valore o hai bisogno del confronto strict.
  • Usa if...elseif quando stai testando espressioni diverse, non un singolo valore contro molti.

Argomenti correlati

Esercitati

Pratica
In PHP, quali istruzioni possono essere usate all'interno di un'istruzione switch?
In PHP, quali istruzioni possono essere usate all'interno di un'istruzione switch?
Was this page helpful?