Я просто охренел с этого. PHP: echo '<pre>'; var_export('deny'==0); echo '</pre>'; // возвращает true У меня накрылись отчёты в контролирующий орган и я теперь правонарушитель из-за такого вот кода. PHP: $status = 0; switch($status) { default: // первый тип отчёта break; case 'deny': // второй тип отчёта break; } Не поверите, но здесь стреляет второй тип отчёта, потому что PHP считает, что 0 == 'deny'. Где логика? --- Добавлено --- Решение у меня есть, можете не предлагать: PHP: $status = 0; switch($status) { case 0: default: // первый тип отчёта break; case 'deny': // второй тип отчёта break; } Но хотелось бы понять всё-таки почему в PHP так происходит.
А про отсутствие строгой типизации и сравнение типов данных Вы не слышали? var_export('deny'===0); //false
@NerdRage дружище, просто напросто нужно выучить вот эти три таблички: https://secure.php.net/manual/ru/types.comparisons.php
+1 Поверим. Правильно считает. Логика вот прям тут, где вы показали. Ну и изучаем таблички выше. --- Добавлено --- Точнее первую.
А что собственно не логично? Ты сравниваешь строку с числом.PHP приводит строку к числу.Так как твоя строка не начинается с цифры,соответственно она 0,отсюда true. Почитал бы про приведение типов в PHP https://secure.php.net/manual/ru/language.types.type-juggling.php Так как в каждом языке оно разное.в PHP главнее является число,а если взять тот же JS,там строка главнее.
Не знал, что в php это не обязательно, но в C рекомендовалось или даже требовалось default-секцию писать внизу оператора switch(), я так по привычке и пишу. А про ошибку все уже всё сказали
Слышал, но в switch-case оно не применимо. Я вообще в курсе, что 0 == false == ''. Но что "php" == 0 вот только сейчас узнал. Понял. То есть, если я сравниваю что-то что может быть строкой или числом, то нужно всё приводить к строке. PHP: $status = 0; switch((string)$status) { default: // первый тип отчёта break; case 'deny': // второй тип отчёта break; } В PHP это ничего не даёт.
лучше заранее приводи к нужному типу и делай нужные действия. PHP: $var = (int)'php'; // 0 поэтому и проскакивает у тебя тру.
+1, какая-то нездоровая хрень. Да и чисто по логике default должен быть последним, просто для удобства восприятия.
В switch(___) всегда должно быть строго типизированное значение. switch(strVal()).. switch(intVal()).. и тп. Иначе постоянно будут проблемы.
иногда нужно написать функцию, где тебе "чтото" приходит и сделать по этому параметру switch. Это не говнокод, это особенность нетипизированного интерпретатора. Ну а default конечно в конце должен быть, это да )
То что вы описали есть прямое определение говнокода. Для того чтобы приходило не "что-то", давно используется валидация во внешней (по отношению к логике) абстракции и, на худой конец, https://php.ru/manual/migration70.new-features.html И да, уж в совсем ленивом случае, есть приведение к типу нативным методом, как упомянуто выше.
Чтото приходит в функцию вне зависимости от наличия какихто фич в php7. Тем более, что код зачастую должен работать и в ранних версиях. Да и вообще, причем тут php7? Попробуйте в функции в какойнибудь crm протипизировать вход - граблями замучаетесь махать.
Валидация типов входных значений никоим образом не подвязана к версии PHP и языку в целом. Речь идет о том что логика проверки значений должна быть отделена от логических операций с самими значениями (неважно в каком коде). Иное - есть плохая практика.
и в чем я вас надурил, уважаемый? в том, что перед switch гораздо легче точно привести значение к какому-то типу, чем потом отлавливать баги? так это более чем 20ти летний опыт и десятки мегабайт написанного кода вам говорят, а не я )
если ты не принимаешь нечеткую природу пхп, то у тебя могут быть "баги" если ты изначально не строишь свою логику на этом. Но есть люди, для которых нестрогая типизация языка - это благо, и всю свою логику я выстраиваю исходя из этого. А какой там у кого опыт и кому что проще - это вопрос субъективный. Его не надо подавать как единственно верное решение. Со своей колокольни нормально бить себя тапкой в грудь и грозить багами. А писать об этом безлично: это неправильно. Если ты исходишь из своего опыта - так и пиши - у меня были проблемы с этим двадцать лет, пока я не начал приводить типы перед свичем. Теперь я всем своим знакомым и незнакомым советую поступать так же.
1) Не "уважаемый", а "уважаемые", раз уж обращаетесь ко мне/нам во множественном числе. Повторяю для тех, кто в танке, - "Доку Вам в руки...". Хотя ... "наши люди доку не читают", особенно с "20-ти летним опытом".
В следующий раз, когда в очередной раз будете трассировать код со switch, написанный знатоком сравнения типов (типа чувака "сам не знаю, но читай доки"), вспоминайте не таблицу из доков, а мой ответ. Сократите время на разработку значительно. switch вообще надо поменять на два других оператора switchInt и switchStr --- Добавлено --- Не можешь ничего сказать по существу - молчи.
@Drema я вроде человеческим языком написал, что дело не в том, прав ты или нет, а в том, что ты подаёшь это в манипулятивной демагогической форме. Вот и всё.
Очередной троль ... с 20 летнем опытом. Или бот. И очередной раз бессмысленно потраченное время. Кой чёрт меня дёрнул...