switch ($value) confronta un valore con un elenco di etichette case ed esegue il codice sotto la prima etichetta che corrisponde. Ogni case termina con break; default gestisce tutto ciò che non ha trovato corrispondenza.
Imposta $day a 'fri', 'sun' o 'wed' ed eseguilo di nuovo. Il case default non ha bisogno di break quando è l'ultimo.
Più case per un solo blocco
Per eseguire lo stesso codice per più valori, impila le etichette case senza nulla in mezzo. Un'etichetta che corrisponde prosegue nel codice sottostante.
A differenza di match, uno switch non ha la sintassi con la virgola case 'jpg', 'jpeg':. Le etichette impilate sono l'unico modo.
Fallthrough: cosa succede senza break
È break che ferma uno switch. Senza di esso, PHP esegue il case che corrisponde e poi continua in ogni case sottostante, ignorando le loro etichette, finché non incontra un break o la fine.
Qui il fallthrough è voluto: ogni piano ottiene le sue funzionalità più tutte quelle dei piani più economici. Quando lo scrivi di proposito, aggiungi un commento come // no break così chi legge dopo non lo "corregge". Quando non era voluto, un break mancante è uno dei bug più comuni negli switch.
switch usa il confronto debole (==)
Ogni case viene verificato con ==, non con ===. Una stringa numerica corrisponde a un numero, null corrisponde a false e a "", e true corrisponde a qualsiasi valore che conta come vero. Tocca le celle per confrontare i due operatori.
| $a == $b | 0 | 1 | "0" | "1" | "" | null | false | true | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | |||||||||||
| 1 | |||||||||||
| "0" | |||||||||||
| "1" | |||||||||||
| "" | |||||||||||
| null | |||||||||||
| false | |||||||||||
| true | |||||||||||
| "a" | |||||||||||
| "10" | |||||||||||
| "1e1" |
La conseguenza pratica: una stringa "1" arrivata da un form finisce in case 1: senza alcuna conversione, ed è spesso quello che vuoi. Ma switch (true) con una stringa non vuota, oppure null di fronte a case false:, può scegliere un case che non ti aspettavi.
Nota la riga di null: non arriva mai a case false:, perché null == 0 è già vero e case 0: viene prima. Con il confronto debole, l'ordine dei case cambia il risultato. Da PHP 8, 0 == "a" è falso (in PHP 7 era vero), quindi una stringa non numerica non corrisponde più a case 0:. Se ti serve ===, usa un'espressione match, trattata alla fine di questa pagina.
switch(true) per intervalli e condizioni
Un'etichetta case può essere qualsiasi espressione. Con switch (true), ogni case è una condizione, e vince la prima che equivale a true.
Assicurati che ogni case sia un vero booleano. A causa del confronto debole, case $name: corrisponderebbe ogni volta che $name è una stringa non vuota.
switch dentro un ciclo: break e continue
Dentro un ciclo, break in uno switch esce solo dallo switch, non dal ciclo. Per fermare il ciclo usa break 2. continue dentro uno switch si comporta come break, e PHP avvisa in fase di compilazione: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Scrivi continue 2 per passare all'iterazione successiva del ciclo.
switch vs match
PHP 8 ha aggiunto match, che copre la maggior parte degli usi di switch con meno codice. Confronta con ===, restituisce un valore, non prosegue mai nei case successivi, accetta condizioni separate da virgola e lancia un UnhandledMatchError quando nulla corrisponde, così un case dimenticato non può passare inosservato.
Tieni switch quando un case richiede più istruzioni, o quando il fallthrough è proprio lo scopo, come nell'esempio dei piani. Per associare un valore a un risultato, match è più breve e più sicuro.
Domande frequenti
Come uso più case per un solo blocco in uno switch PHP?
Impila le etichette case senza codice tra loro: case 'sat': case 'sun': echo 'weekend'; break;. Ogni etichetta prosegue nel codice condiviso. PHP non ha la sintassi case 'sat', 'sun': per switch; quella forma con la virgola appartiene a match.
Lo switch di PHP usa il confronto stretto?
No. switch confronta con il == debole, quindi case '1': corrisponde all'intero 1 e case 0: corrisponde a '0'. Per un confronto stretto con ===, usa un'espressione match oppure switch (true) con === dentro ogni case.
Cosa succede se dimentico break in uno switch PHP?
L'esecuzione prosegue: dopo il case che corrisponde, PHP continua a eseguire il codice di tutti i case sottostanti finché non incontra un break, un return o la fine dello switch. A volte è voluto, ma di solito è un bug.
Uno switch PHP può controllare intervalli come maggiore di?
Sì, con switch (true): ogni case contiene una condizione come case $score >= 90:, e viene eseguito il primo che è vero. Un'espressione match (true) fa lo stesso con il confronto stretto e restituisce un valore.