Есть ли способ сделать так, чтобы следующий код все еще использовал переключатель и возвращает 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
случаю).