Forum und email

switch

switch è simile a una serie di if sulla stessa espressione. In molti casi può essere necessario confrontare una variabile (o espressione) con differenti valori ed eseguire un differente blocco di istruzioni a seconda del valore di detta variabile. Questo è esattamente quello che fa la struttura di controllo switch.

Nota: Si noti che a differenza di altri linguaggi, l'istruzione continue si può utilizzare anche con switch ed ha un comportamento simile a break. Se si ha uno switch all'interno di un ciclo e si desidera continuare con il prossimo ciclo del loop esterno, utilizzare continue 2.

Gli esempi seguenti mostrano due maniere differenti di scrivere la stessa cosa, uno utilizzando una serie di istruzioni if ed elseif l'altro utilizzando switch:

Example#1 Struttura switch

<?php
if ($i == 0) {
    echo  
"i è uguale a 0";
} elseif (
$i == 1) {
    echo  
"i è uguale a 1";
} elseif (
$i == 2) {
    echo  
"i è uguale a 2";
}

switch (
$i) {
    case 
0:
        echo 
"i è uguale a 0";
        break;
    case 
1:
        echo 
"i è uguale a 1";
        break;
    case 
2:
        echo 
"i è uguale a 2";
        break;
}
?>

Example#2 L'istruzione switch permette l'uso di stringhe

<?php
switch ($i) {
case 
"apple":
    echo 
"i is apple";
    break;
case 
"bar":
    echo 
"i is bar";
    break;
case 
"cake":
    echo 
"i is cake";
    break;
}
?>

È importante comprendere esattamente come viene eseguita la clausola switch per evitare errori. Un'istruzione switch esegue linea dopo linea le istruzioni in essa contenuta. All'inizio non viene eseguito alcun codice. Solamente quando incontra una clausola case il cui valore è uguale al valore della viariabile, PHP inizia ad eseguire le istruzioni contenute nel blocco case. PHP continua l'esecuzione delle istruzioni fino alla termine del blocco switch, o quando incontra un'istruzione break. Se non esiste alcuna istruzione break al termine di un blocco case PHP continuerà l'esecuzione delle istruzioni del blocco case successivo. Per esempio:

<?php
switch ($i) {
    case 
0:
        echo 
"i è uguale a 0";
    case 
1:
        echo 
"i è uguale a 1";
    case 
2:
        echo 
"i è uguale a 2";
}
?>

In questo caso se $i è uguale a 0, PHP eseguirà tutte le istruzioni echo!. Se $i è uguale a 1, PHP eseguirà le ultime due echo. Si sarebbe ottenuto il comportamento atteso ( visualizzazione di 'i uguale a 2') solamente se $i è uguale a 2. Pertanto è importante non dimenticare l'istruzione break (anche se in alcuni casi potrà essere necessario non utilizzarla).

In un'istruzione switch, la condizione in parentesi viene valutata una sola volta e il risultato viene confrontato con ciascun ramo case. Utilizzando elseif, la condizione viene valutata una seconda volta. Se tale condizione è più complessa di un semplice confronto e/o è in un ciclo piuttosto pesante, l'uso di switch dovrebbe garantire un minor tempo di esecuzione.

Un blocco case può anche non contenere istruzioni, nel qual caso il controllo passa semplicemente al successivo blocco case.

<?php
switch ($i) {
case 
0:
case 
1:
case 
2:
     print 
"i è minore di 3 ma non negativo";
     break;
case 
3:
     print 
"i è 3";
}
?>

Un blocco case speciale è il il blocco case di default. Uguaglia tutte le condizioni non uguagliate nei blocchi case precedenti e dev'essere l'ultimo blocco case. Per esempio:

<?php
switch ($i) {
case 
0:
    echo 
"i è uguale a 0";
    break;
case 
1:
    echo 
"i è uguale a 1";
    break;
case 
2:
    echo 
"i è uguale a 2";
    break;
default:
    echo 
"i è diverso da 0, 1 o 2";
}
?>

L'espressione in un ramo case può essere qualsiasi espressione il cui valore sarà di tipo intero, decimale, numerico e stringa. Array e oggetti (objects) non sono ammessi a meno che non siano dereferenziati a un tipo di dato semplice tra quelli precedentemente elencati.

Come per altre strutture di controllo è possibile utilizzare una sintassi alternativa. Si veda Sintassi alternativa per le strutture di controllo per ulteriori esempi.

<?php
switch ($i):
case 
0:
    echo 
"i è uguale a 0";
    break;
case 
1:
    echo 
"i è uguale a 1";
    break;
case 
2:
    echo 
"i è uguale a 2";
    break;
default:
    echo 
"i è diverso da 0, 1 o 2";
endswitch;
?>