make switch use === сравнение нет == сравнение в PHP

Есть ли способ сделать так, чтобы следующий код все еще использовал переключатель и возвращает b не? Благодаря!

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

Если использовать инструкции if, вы бы сделали это следующим образом:

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

Но для более сложных примеров это становится многословным.

Извините, вы не можете использовать сравнение === в инструкции switch, поскольку в соответствии с документацией switch () :

Обратите внимание, что переключатель / случай не сравнивает сравнение.

Это означает, что вам придется придумать обходной путь. Из таблицы бесплатных сравнений вы можете использовать тот факт, что NULL == "0" является ложным по типу:

 <?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' ?> 

Демо-версия

Один из способов сделать это – сделать то, что я думаю, как обратный переключатель (для этого может быть более официальное название). Идея заключается в том, что вы помещаете true или false наверху, а затем ваши условные выражения в утверждениях case .

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

Не с switch – это только так называемые «свободные» сравнения. Вы всегда можете заменить его блоком if/else if , используя === .

Предположительно, вы включаете переменную и ожидаете целые числа. Почему бы просто не проверить состояние целого числа переменной заранее, используя is_int($val) ?

У меня была та же проблема в коммутаторе с строкой, содержащей числа («15.2» равно «15.20» в коммутаторе для php)

Я решил проблему, добавив письмо перед текстом, чтобы сравнить

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

make switch use === сравнение нет == сравнение в PHP

К сожалению, switch использует слабое сравнение, и насколько я знаю, нет возможности изменить это.

Оператор switch в php делает только сравнения (==) см. http://www.php.net/manual/en/control-structures.switch.php

Используйте if / elseif / else, если вам нужны строгие сравнения.

Я просто использую

 $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; } 

Я думаю, что это все еще выглядит очень читаемым, если комментарий, начинающийся с // , остается позади (и те, которые начинаются с # , вероятно, лучше удаляются).

Неа. На странице руководства :

Обратите внимание, что переключатель / случай не сравнивает сравнение .

Если у вас есть только два условия, используйте, например, ваш второй пример. В противном случае сначала проверьте NULL и включите другие возможности:

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

Это невозможно.

Однако вы можете ввести операторы if внутри switch :

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

Или просто:

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

Вы также можете включить тип переменной:

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

Один из лучших способов – проверить значение NULL с помощью is_null

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

Экстраполируя ваш пример кода, я думаю, у вас есть куча регулярных случаев и один специальный случай (здесь, null ).

Самое простое, что я могу выяснить, это обработать этот случай перед коммутатором:

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

Возможно, также добавьте комментарий для запоминания null который неожиданно будет соответствовать случаю 0 (также наоборот, 0 будет соответствовать null случаю).