За последние 24 часа нас посетили 17728 программистов и 1659 роботов. Сейчас ищут 915 программистов ...

Switch - Case или IF обрабатывается неправильно

Тема в разделе "Прочие вопросы по PHP", создана пользователем muxa92, 17 янв 2014.

  1. muxa92

    muxa92 Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    4
    Симпатии:
    0
    Всем привет.

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

    $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<<"

    вопрос: КАК переменная с явным нулем принимает подобные значения и проходит такие проверки?

    пока временно решил строгой проверкой (===) но свитч-кейс был бы предпочтительнее в моем случае

    идеи?
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    switch ((string)$value) {
    ...
    }
     
  3. muxa92

    muxa92 Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    4
    Симпатии:
    0
    Спасибо, работает.
    А можно ради спортивного интереса узнать, почему такое вообще происходит? что сравнивается?
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    При сравнении числового типа (integer, float) и строки (string) - строка приводится к числовому типу (в соответствии с правилами приведения). Те строки, которые совсем не похожи на числа - равны нулю.
    В PHP с его приведением типов много таких подводных камней. С чистыми строками тоже. Например "1" равно "01", ибо если слева и справа стоят числовые строки (которые проходят проверку is_numeric) - то они приводятся к числовому типу и сравниваются.
    В общем, нужно изучить документацию внимательно на этот счет.
    http://php.ru/manual/language.operators.comparison.html
     
  5. muxa92

    muxa92 Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    4
    Симпатии:
    0
    Благодарю, очень полезная инфа :) странно, что за пятилетний опыт программирования на php еще ни разу подобных проблем не встречалось.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Тройное равно юзай
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Угу, в switch-е
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
     
  9. muxa92

    muxa92 Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    4
    Симпатии:
    0
    читаем вопрос корректнее.. до тройного равно я бы и сам додумался, но я бы не стал задавать тут этот вопрос, если бы не хотел использовать свитч-кейс. Вопрос был не "что юзать", а "почему так происходит".
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дык, приводится строка к числу для сравнения. строка всегда ноль. =)

    юзайте тройное равно. это и есть объяснение, почему так происходит.