Будьте внимательны при проверках $var == 'Y'

1k
Алексей,
Будьте внимательны при проверках $var == 'Y'
Будьте внимательны при проверках $var == 'Y'

В Битрикс проверки на строковую "Y" очень популярны, т.к. сами разработчики ядра используют их повсеместно. Проблема в том, что проверка идет с преобразованием типов. И если "Y" сравнивать с "0", то результат будет true.

В Битрикс проверки на строковую "Y" очень популярны, т.к. сами разработчики ядра используют их повсеместно. Проблема в том, что проверка идет с преобразованием типов. И если "Y" сравнивать с "0", то результат будет true.

var_dump(0 == "Y"); // 0 == 0 -> true
В случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа. Эти правила также распространяются на оператор switch. Преобразование типов не происходит при использовании === или !== так как в этом случае кроме самих значений сравниваются еще и типы.

Пример из "битрикс", проверка свойства типа список, которую мне все используем.

if ($arResult['PROPERTIES']['NEW']['VALUE'] == 'Y') {
	echo 'Новинка'
}

Если поменять тип свойства NEW (например на "Чекбокс, простое число") и его значением будет 0 или 1, то условие будет работать неверно.

Решение простое, для строковых проверок используйте оператор сравнение с типом

var_dump(0 === "Y"); // false

if ($arResult['PROPERTIES']['NEW']['VALUE'] === 'Y') {
	echo 'Новинка'
}

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 25 февраля 2020
разработчику, баг
Поделиться
Похожие статьи
could not start session because headers have already been sent
Ошибка чаще всего возникает либо из-за лишних символов (например пробел перед <?php), либ...
Читать дальше » 0
Алексей,
Рекурсивный поиск подстроки в php файлах через консоль
В битриксе много файлов, очень много файлов, иногда можно потратить десятки минут на поиск нужного к...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
В Битрикс проверки на строковую "Y" очень популярны, т.к. сами разработчики ядра используют их повсеместно. Проблема в том, что проверка идет с преобразованием типов. И если "Y" сравнивать с "0", то результат будет true.