Всем привет. буквально вчера столкнулся с подобным парадоксом: имеется подобный код : $value =0; switch ($value) { case "a" : /*какой-то код*/ break; case "b" : /*какой-то код*/ break; case "c" : /*какой-то код*/ break; case "d" : /*какой-то код*/ break; } Логически, свитч - кейс вообще должен быть проигнорирован, так как не совпадает ни с одним значением и default не указан. но, почему-то обрабатывается первый кейс (case "a"). думал, может я туплю. написал подобное: $value = 0; if ($value == "asdasdasd") {echo ">>".$value."<<";} выводится ">>0<<" вопрос: КАК переменная с явным нулем принимает подобные значения и проходит такие проверки? пока временно решил строгой проверкой (===) но свитч-кейс был бы предпочтительнее в моем случае идеи?
Спасибо, работает. А можно ради спортивного интереса узнать, почему такое вообще происходит? что сравнивается?
При сравнении числового типа (integer, float) и строки (string) - строка приводится к числовому типу (в соответствии с правилами приведения). Те строки, которые совсем не похожи на числа - равны нулю. В PHP с его приведением типов много таких подводных камней. С чистыми строками тоже. Например "1" равно "01", ибо если слева и справа стоят числовые строки (которые проходят проверку is_numeric) - то они приводятся к числовому типу и сравниваются. В общем, нужно изучить документацию внимательно на этот счет. http://php.ru/manual/language.operators.comparison.html
Благодарю, очень полезная инфа странно, что за пятилетний опыт программирования на php еще ни разу подобных проблем не встречалось.
читаем вопрос корректнее.. до тройного равно я бы и сам додумался, но я бы не стал задавать тут этот вопрос, если бы не хотел использовать свитч-кейс. Вопрос был не "что юзать", а "почему так происходит".
дык, приводится строка к числу для сравнения. строка всегда ноль. =) юзайте тройное равно. это и есть объяснение, почему так происходит.