Ответ вслух Junior Типы и строгая типизация спрашивают часто обновлено

Приведение типов в PHP

Вопрос

Расскажите, как PHP приводит типы и какие у этого ловушки.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

PHP динамически типизирован и охотно приводит типы. Главное место, где это проявляется, нестрогое сравнение ==: "1" == "01" истинно, потому что обе строки числовые.

Что должно прозвучать в ответе

  • Нестрогое сравнение == приводит типы, === нет

  • 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 ошибок.