Make switch use === сравнение нет == сравнение в PHP
Есть ли способ сделать так, чтобы следующий код все еще использовал переключатель и возвращает b
not a
? Спасибо!
$var = 0;
switch($var) {
case NULL : return 'a'; break;
default : return 'b'; break;
}
Используя инструкции if, вы, конечно, сделаете это так:
$var = 0;
if($var === NULL) return 'a';
else return 'b';
Но для более сложных примеров это становится многословным.
Ответы
Ответ 1
Извините, вы не можете использовать сравнение ===
в инструкции switch, так как согласно switch() documentation:
Обратите внимание, что переключатель/случай не сравнивает сравнение.
Это означает, что вам придется придумать обходной путь. Из таблица сравнений вы можете использовать тот факт, что NULL == "0"
является ложным по типу 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'
?>
Live Demo
Ответ 2
Один из способов сделать это - сделать то, что я думаю, как обратный переключатель (для этого может быть более официальное название). Идея состоит в том, что вы помещаете true
или false
вверху, а затем ваши условные выражения в операторы case
.
switch(true)
{
case ($var === NULL):
return 'a';
break;
case ($var === 0):
return 'b';
break;
default:
return 'c';
}
Ответ 3
Не с switch
- это только так называемые "свободные" сравнения. Вы всегда можете заменить его блоком if/else if
, используя ===
.
Ответ 4
Предположительно, вы включаете переменную и ожидаете целые числа. Почему бы просто не проверить состояние целого числа переменной заранее, используя is_int($val)
?
Ответ 5
У меня была такая же проблема в коммутаторе с строкой, содержащей числа ( "15.2" равно "15.20" в коммутаторе для php)
Я решил проблему, добавив письмо перед текстом, чтобы сравнить
$var = '15.20';
switch ('#'.$var) {
case '#15.2' :
echo 'wrong';
break;
case '#15.20' :
echo 'right';
break;
}
Ответ 6
Использовать коммутатор === сравнение нет == сравнение в PHP
К сожалению switch
использует свободное сравнение, и насколько я знаю, нет способа изменить это.
Ответ 7
Неа. На странице руководства:
Обратите внимание, что switch/case делает свободное сравнение.
Если у вас есть только два условия, используйте if
как ваш второй пример. В противном случае сначала проверьте NULL
и включите другие возможности:
if (is_null($var))
{
return 'a';
}
switch ($var)
{
// ...
}
Ответ 8
Оператор switch в php делает только сравнения (==) см. http://www.php.net/manual/en/control-structures.switch.php
Используйте if/elseif/else, если вам нужны строгие сравнения.
Ответ 9
Я просто использую
$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;
}
Я думаю, что это все еще выглядит очень читаемым, если оставить комментарий, начинающийся с //
(и те, которые начинаются с #
, вероятно, лучше удаляются).
Ответ 10
Это невозможно.
Вы можете, однако, поместить операторы 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';
}
Ответ 11
Вы также можете включить тип переменной:
switch (gettype($var)) {
...
}
Ответ 12
Один из лучших способов - проверить значение NULL с помощью is_null
<?php
echo getValue();
function getValue()
{
$var = 0;
switch(true) {
case is_null($var) : return 'a'; break;
default : return 'b'; break;
}
}
?>
Ответ 13
Экстраполируя из вашего примера кода, я думаю, у вас есть куча регулярных случаев и один специальный случай (здесь null
).
Проще всего я могу понять, что нужно обработать этот случай перед коммутатором:
if ($value === null) {
return 'null';
}
switch ($value) {
case 0:
return 'zero';
case 1:
return 'one';
case 2:
return 'two';
}
Возможно, также добавьте комментарий, чтобы запомнить null
неожиданно будет соответствовать случаю 0
(также наоборот, 0
будет соответствовать случаю null
).
Ответ 14
Вот ваш оригинальный код в "строгом" выражении switch:
switch(true) {
case $var === null:
return 'a';
default:
return 'b';
}
Это также может обрабатывать более сложные операторы switch, как это:
switch(true) {
case $var === null:
return 'a';
break;
case $var === 4:
case $var === 'foobar':
return 'b';
default:
return 'c';
break;
}