2016-11-11 2 views
0

Я заметил, что оператор switch производит неправильные результаты, когда используются переменные с значениями ложности.Оператор switch PHP выдает неверные результаты при использовании значений фальши

Например:

$total = 0;  // Same results with '' as a value 


switch ($total) { 
case 5: 
echo "Five"; 
break; 

case 10: 
echo "Ten"; 
break; 

case $total >= 10: 
echo "More than or equal to one"; 
break; 

default : 
echo "Anything"; 
} 

Строка, которая получает отражение с помощью этого сценария, является «более или равно одному».

Можете ли вы сказать мне, нужно ли мне что-то сделать, чтобы заставить оператор switch работать со значениями ложности? Ссылка также будет очень полезна, если вы предпочитаете что-то подобное, любая помощь будет более чем приветствуется.

Спасибо за ваше время.

+1

'case $ total> = 10:'? вы не можете использовать выражение (больше или равно) самостоятельно, вы можете назначить его; выражения вычисляются в 'if', и я не вижу, как вы его тестируете. –

+1

@ Fred-ii- Спасибо за ваш комментарий. Вы уверены, что этого нельзя сделать так? Я думаю, что на самом деле это не считается неправильным (например: http://stackoverflow.com/a/24813225/3915624). –

+3

Обратите внимание на использование 'switch' там' switch (true) {', а не' switch ($ variable) '. См. Https://eval.in/676379 и https://eval.in/676378 – chris85

ответ

1

Величина, передаваемая в switch, сравнивается с величиной каждого случая. В случае:

$total >= 10 

оценка выполняется первым, а затем по сравнению с $total. $total >= 10 является

BOOL (ложь)

с рыхлым сравнением (который switch использует) 0 и false матча.

var_dump(false == 0); 

BOOL (истина)

Так выход:

Более или равно один

Когда не ищет равного сравнения я 'd использовать if/elseif s, http://php.net/manual/en/control-structures.elseif.php.

+0

Хорошо, это было неловко, и я не уверен, что мой недостаток сна может объяснить это. Я понимаю, что вы имеете в виду, я все еще задаюсь вопросом, есть ли временное решение для оператора switch (как и в случае тройного оператора, например). –

+0

Кроме того, я заметил, что if/else действительно работает с нулями, но он не работает с другими значениями фальши, такими как пустые строки. На мгновение я подумал о том, чтобы задать другой вопрос здесь о SO для обходного пути if/else, но я думаю, что я просто прекращу безумие. –

0

Оператор A switch логически эквивалентен набору каскадных if-else операторов; каждое выражение, которое вы ставите на case, сравнивается (с использованием ==) с выражением помещается в switch.

Ваш код такой же, как:

$total = 0; 

if ($total == 5) { 
    echo "Five"; 
} elseif ($total == 10) { 
    echo "Ten"; 
} elseif ($total == ($total >= 10)) { 
    echo "More than or equal to one"; 
} else { 
    echo "Anything"; 
} 

Теперь должно быть ясно. Первые два условия if оцениваются до FALSE, а третий оценивается до TRUE и выводится сообщение «Больше или равно одному».

Подробнее о switch statement и о способе PHP comparing values.

+0

Спасибо за ваш комментарий, мой вопрос о том, есть ли способ использовать переключатель с фальшивыми значениями (которые должны рассматриваться как фактические значения), остается. Я знаю, например, что это может быть достигнуто с помощью тернарного оператора, если? используется вместо?:, мне было интересно, есть ли аналогичное решение для оператора switch. –

+0

Боюсь, я не понял ваш вопрос. 'switch' использует' == 'для сравнения выражения, которое вы помещаете в' switch', с выражениями, которые вы помещаете в каждый 'case'. Он выполняет одно сравнение за раз, в порядке, в котором операторы 'case' помещаются в код, пока одно сравнение не сравнится с« TRUE ». Если ни один из них не оценивает значение «TRUE», он переходит на метку «default» (если таковая существует). В вашем примере '$ total' равен' 0' и '$ total> = 10' оценивается как' FALSE'. Поскольку '0' и' FALSE' равны ('==') в соответствии с правилами сравнения PHP, происходит совпадение, и берется ответ 'case $ total> = 0:'. – axiac

+0

Вы говорите в вопросе: «По какой-то причине мне кажется почти невозможным заметить, что кто-то упоминает об этом поведении онлайн». * - Поведение оператора 'switch' объясняется в первом абзаце, а второе примечание о его Справочная страница PHP: http://php.net/manual/en/control-structures.switch.php – axiac

Смежные вопросы