Приведение типов в PHP
Вопрос
Расскажите, как PHP приводит типы и какие у этого ловушки.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Нестрогое сравнение == приводит типы, === нет
PHP 8 изменил сравнение чисел со строками: нечисловая строка сравнивается как строка
Ложные значения: 0, "", "0", [], null
strict_types отключает неявное приведение аргументов
in_array и array_search по умолчанию нестрогие
Привычка: ===, strict_types, статический анализ
Что могут спросить следом
- Что вернёт in_array("abc", [0]) в PHP 7 и в PHP 8?
- Почему switch тоже сравнивает нестрого?
Разбор
PHP динамически типизирован и охотно приводит типы. Главное место, где это проявляется, нестрогое сравнение ==: "1" == "01" истинно, потому что обе строки числовые. Строгое === сравнивает и тип, и значение, и я использую его по умолчанию.
В PHP 8 правила стали разумнее: если строка не похожа на число, то при сравнении с числом число приводится к строке, поэтому 0 == "abc" теперь ложь, а в PHP 7 было истиной. Но ловушки остались: ложными считаются 0, пустая строка, строка "0", пустой массив и null, так что if ($value) не отличит ноль от отсутствия значения.
Ещё нестрого сравнивают in_array, array_search и switch, у первых двух есть третий параметр strict. В своём коде я включаю declare(strict_types=1), чтобы функции не принимали строки вместо чисел, объявляю типы и гоняю PHPStan.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.