spina ha scritto:
Anche a me piace questa soluzione (la prendo per funzionante visto che l'hai scritta), rende il codice più leggibile. Però anche qui, un numero o appartiene all'intervallo (3,8) o all'intervallo (-inf, 3] o all'intervallo [8,+inf), quindi il secondo case dovrebbe essere (>=8) e non (>3) e il terzo (<=3) e non (<8), non trovi?
Certo che funziona, provo sempre il codice prima di postarlo ^^ Per quanto riguarda gli operatori di confronto, usando >= e <= non si sarebbe mai verificato il "default", perchè i case avrebbero *coperto* tutte le eventualità.
Ho spezzato il check iniziale in due parti volutamente, per chiarire un concetto importante: lo switch non *salta* all'istruzione adatta, ma verifica i case in sequenza, motivo per cui il check più restrittivo va effettuato per primo.
spina ha scritto:
Più precisamente è il break che interrompe lo switch!
Spina
Mai asserito il contrario... io parlavo di un altra cosa: al verificarsi del primo case, switch termina di eseguire
i check . Significa che dal momento della verifica con successo del primo case, gli ulteriori case vengono del tutto ignorati, break o non break. Che poi il break faccia uscire forzatamente dal costrutto è un altro discorso.
Ragazzi, avete fatto un errore nel codice che avete postato, attenzione.
Switch esegue un confronto fra il valore passato all'istruzione switch ed il valore dei vari case. Se all'interno di un case viene inserito un confronto booleano, il valore restituito sarà boolaeano (true/false). Per cui il valore da confrontare è a sua volta da considerare booleano.
Per chiarire, facciamo un esempio. Il codice:
Codice: Seleziona tutto
<?php
$temperatura = 0;
switch ($temperatura)
{
case ($temperatura < 10):
echo "minore di 10";
break;
default:
echo "altro";
}
?>
per quanto potrebbe apparire corretto, darà un risultato inaspettato, ci visualizzerà "altro".
Il motivo è che, come ho spiegato, il risultato di un confronto booleano è booleano (true/false) e lo 0 nelle conversioni di tipo vale false. Per cui, il check "($temperatura < 10)" restituirà
true, che verrà confrontato con il valore nello switch $temperatura che essendo 0 viene convertito in
false, ed il risultato sarà mancato riscontro, pertanto il costrutto passerà al default.
Il codice di cui sopra va obbligatoriamente scritto nel seguente modo:
Codice: Seleziona tutto
<?php
$temperatura = 0;
switch (true)
{
case ($temperatura < 10):
echo "minore di 10";
break;
default:
echo "altro";
}
?>
ed in tal caso il risultato sarà "minore di 10", come da previsione. Altre forme sono errate, a meno che non ci sia sott'inteso un comportamento voluto.
Se non sono stato chiaro e devo dare ulteriori delucidazioni, ditemelo e cercherò di spiegarmi meglio.