fai il cambio usa === confronto non == confronto in PHP

Esiste comunque la possibilità di fare in modo che il codice seguente usi ancora un interruttore e restituisca b non a ? Grazie!

 $var = 0; switch($var) { case NULL : return 'a'; break; default : return 'b'; break; } 

Usando le dichiarazioni if, ovviamente, lo faresti in questo modo:

 $var = 0; if($var === NULL) return 'a'; else return 'b'; 

Ma per esempi più complessi, questo diventa prolisso.

Spiacenti, non è ansible utilizzare un confronto === in un'istruzione switch, poiché in base alla documentazione switch () :

Nota che l'interruttore / caso non ha confronto.

Ciò significa che dovrai trovare una soluzione alternativa. Dalla tabella di confronti liberi , potresti fare uso del fatto che NULL == "0" è falso per tipo casting:

 <?php $var = 0; switch((string)$var) { case "" : echo 'a'; break; // This tests for NULL or empty string default : echo 'b'; break; // Everything else, including zero } // Output: 'b' ?> 

Dimostrazione dal vivo

Un modo per farlo è quello di fare quello che penso come un interruttore all'indietro (potrebbe esserci un nome più ufficiale). L'idea è che tu metta il true o il false in cima e poi i tuoi condizionali nelle affermazioni del case .

 switch(true) { case ($var === NULL): return 'a'; break; case ($var === 0): return 'b'; break; default: return 'c'; } 

Non con switch : si tratta solo di confronti "liberi". Puoi sempre sostituirlo con un block if/else if , usando === .

Presumibilmente si sta accendendo la variabile e si aspettano numbers interi. Perché non controllare semplicemente lo stato integer della variabile usando is_int($val) ?

Ho avuto lo stesso problema in un interruttore con numbers contenenti stringhe ("15.2" è uguale a "15.20" in un interruttore per php)

Ho risolto il problema aggiungendo una lettera prima del text da confrontare

 $var = '15.20'; switch ('#'.$var) { case '#15.2' : echo 'wrong'; break; case '#15.20' : echo 'right'; break; } 

fai il cambio usa === confronto non == confronto in PHP

Purtroppo, l' switch utilizza un confronto random e per quanto ne so non c'è modo di cambiarlo.

L'istruzione switch in php fa solo confronti parziali (==) vedi http://www.php.net/manual/en/control-structures.switch.php

Usa if / elseif / else se hai bisogno di confronti rigidi.

Io uso solo

 $var === null and $var = -1; // since switch is not type-safe switch ( $var ) { case 0: # this tests for zero/empty string/false break; case -1: # this tests for null break; } 

Penso che questo sia ancora molto leggibile se il commento che inizia con // è lasciato indietro (e quelli che iniziano con # sono probabilmente meglio eliminati).

No. Dalla pagina di manuale :

Nota che l'interruttore / caso non ha confronto .

Se hai solo due condizioni, usa un if come il tuo secondo esempio. Altrimenti, controlla prima NULL e accendi le altre possibilità:

 if (is_null($var)) { return 'a'; } switch ($var) { // ... } 

Non è ansible.

Tuttavia, puoi inserire le istruzioni if all'interno dello switch :

 switch($var) { // Loose cases here case 0: if($var === NULL) { return 'a'; } // Fall through default: return 'b'; } 

O semplicemente:

 switch($var) { // Loose cases here default: if($var === NULL) { return 'a'; } return 'b'; } 

Puoi anche triggersre il tipo di variabile:

 switch (gettype($var)) { ... } 

Uno dei modi migliori è verificare il valore NULL usando is_null

 <?php echo getValue(); function getValue() { $var = 0; switch(true) { case is_null($var) : return 'a'; break; default : return 'b'; break; } } ?> 

Estrapolando dal tuo codice di esempio, immagino tu abbia un sacco di casi regolari e un caso speciale (qui, null ).

Il più semplice che riesco a capire è gestire questo caso prima dell'interruttore:

 if ($value === null) { return 'null'; } switch ($value) { case 0: return 'zero'; case 1: return 'one'; case 2: return 'two'; } 

Forse anche aggiungere un commento per ricordare che null corrisponderebbe in modo imprevisto al caso 0 (anche al contrario, 0 corrisponderebbe a un caso null ).