switch
In PHP, la parola chiave "switch" valuta un valore ed esegue azioni diverse in base ad esso. È un'alternativa all'uso di più istruzioni "if".
L'istruzione switch in PHP
L'istruzione switch in PHP valuta un'espressione ed esegue il blocco di codice corrispondente al suo valore. È l'alternativa più leggibile a una lunga catena di istruzioni if / elseif / else quando si confronta la stessa variabile con molti valori possibili.
Questo capitolo tratta la sintassi, la fondamentale parola chiave break, il fall-through intenzionale, la sintassi alternativa endswitch e l'insidia del confronto non rigoroso che mette in difficoltà la maggior parte dei principianti.
Sintassi
La sintassi di base di un'istruzione switch in PHP è la seguente:
<?php
switch ($value) {
case $value1:
// Code block here
break;
case $value2:
// Code block here
break;
default:
// Code block here
}PHP confronta $value con ogni case dall'alto verso il basso. La prima corrispondenza vince: il suo blocco viene eseguito e break esce dallo switch. Se nessun case corrisponde, viene eseguito il blocco default opzionale. default non deve necessariamente essere l'ultimo, ma posizionarlo alla fine è la convenzione che i lettori si aspettano.
Perché break è importante
L'istruzione break interrompe l'esecuzione ed esce dal blocco switch. Senza di essa, PHP continua a eseguire il codice in tutti i case successivi finché non incontra un break o la fine del blocco — un comportamento chiamato fall-through. Questo è il bug più comune nelle istruzioni switch:
<?php
$role = "editor";
switch ($role) {
case "admin":
echo "Full access. ";
// no break — execution "falls through" to the next case
case "editor":
echo "Can edit content. ";
break;
case "viewer":
echo "Read only.";
break;
}
// Output: Can edit content.Qui editor corrisponde, stampa il suo messaggio e il break esce in modo pulito. Dimenticare il break dopo admin permetterebbe a un amministratore di eseguire anche il codice di editor. Vedere break per la parola chiave completa.
Fall-through intenzionale
Il fall-through non è sempre un errore. Impilare etichette case vuote permette a più valori di condividere un unico blocco — un modo elegante per raggruppare condizioni:
<?php
$month = 2;
switch ($month) {
case 12:
case 1:
case 2:
echo "Winter";
break;
case 3:
case 4:
case 5:
echo "Spring";
break;
default:
echo "Another season";
}
// Output: WinterEsempi
Vediamo alcuni esempi pratici di utilizzo di switch:
<?php
// Example 1
$dayOfWeek = "Wednesday";
switch ($dayOfWeek) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
echo "It's a weekday.";
break;
case "Saturday":
case "Sunday":
echo "It's a weekend.";
break;
}
// Example 2
$grade = "B";
switch ($grade) {
case "A":
echo "Excellent!";
break;
case "B":
echo "Good job!";
break;
case "C":
echo "Could do better.";
break;
default:
echo "Please enter a valid grade.";
}Il primo esempio raggruppa i nomi dei giorni feriali con etichette case impilate per distinguere tra giorno feriale e fine settimana. Il secondo esempio associa un voto letterale a un messaggio di feedback, con default che gestisce qualsiasi valore non corrispondente.
L'insidia del confronto non rigoroso
Per impostazione predefinita, switch confronta con uguaglianza non rigorosa (==), quindi i valori vengono confrontati dopo la conversione di tipo — non con === rigoroso. Questo può produrre corrispondenze sorprendenti:
<?php
$value = "1";
switch ($value) {
case 1:
echo "Matched the integer 1!";
break;
default:
echo "Matched default.";
}
// Output: Matched the integer 1!La string "1" corrisponde all'intero case 1 perché == converte i tipi prima di confrontare. Quando hai bisogno di un controllo del tipo rigoroso, usa una catena di istruzioni if / elseif con ===, oppure usa l'espressione match (PHP 8+), che confronta in modo rigoroso e restituisce un valore:
<?php
$grade = "B";
$message = match ($grade) {
"A" => "Excellent!",
"B" => "Good job!",
"C" => "Could do better.",
default => "Please enter a valid grade.",
};
echo $message;
// Output: Good job!match non ha fall-through e non richiede break, eliminando un'intera categoria di bug.
Sintassi alternativa endswitch
Quando si incorpora PHP nei template HTML, la forma con i due punti e endswitch può risultare più leggibile:
<?php switch ($status): ?>
<?php case "active": ?>
<span>Active</span>
<?php break; ?>
<?php default: ?>
<span>Inactive</span>
<?php endswitch; ?>Vantaggi
- Leggibilità — uno
switchè più facile da analizzare rispetto a molte istruzioniifquando si confronta la stessa variabile con diversi valori. - Valutazione singola — l'espressione dello switch viene valutata una sola volta, quindi confrontata con ogni
case.
Capitoli correlati
- PHP if...else...elseif — ramificazione quando le condizioni differiscono
- PHP break e break vs. continue — controllo del flusso
- PHP operators — confronto e uguaglianza
- PHP loops — ripetizione di blocchi di codice