> Что происходит при несовпадении типов и как происходит проверка типов в PHP (PHP)

Уровень: middle · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: vanta

Стек: PHP

> Пример ответа

Короткий ответ

PHP - язык с динамической типизацией: переменная может менять тип в рантайме, а проверка типов происходит в момент выполнения операций, а не на этапе компиляции. При несовпадении типов PHP либо пытается привести значение к ожидаемому типу (для слаботипизированных операций), либо выбрасывает TypeError (при строгой типизации или typed properties). Поведение зависит от контекста: операторы, функции, параметры и возвращаемые значения имеют свои правила приведения.

Подробное объяснение

PHP работает в двух режимах типизации: слабом (coercive, по умолчанию) и строгом (declare(strict_types=1)). В слабом режиме при передаче аргумента в функцию или при операции с несовпадающими типами PHP пытается неявно привести значение. Например, строка "42" при сложении с числом станет числом, а "abc" при арифметической операции вызовет TypeError в PHP 8+ (раньше - предупреждение и приведение к 0).

Проверка типов происходит в нескольких местах:

  • Параметры функций и методов - при вызове проверяется соответствие объявленным типам.
  • Возвращаемые значения - при выходе из функции проверяется тип возвращаемого значения.
  • Свойства классов - typed properties проверяются при присваивании.
  • Операторы - арифметические, строковые, сравнения имеют свои правила приведения.

В строгом режиме (declare(strict_types=1)) неявное приведение для вызовов функций запрещено: передача "42" в параметр int вызовет TypeError. При этом внутри файла со строгой типизацией операторы всё ещё работают в слабом режиме - строгость применяется только к вызовам функций и методов.

Для явного приведения типов используются конструкции (int), (string), (array) и функции intval(), strval() и подобные. Для проверки типа - операторы instanceof, is_int(), gettype() и get_debug_type().

На практике

На практике важно понимать, что несовпадение типов - это не всегда ошибка. В слабом режиме PHP часто приводит типы автоматически, что удобно для быстрой разработки, но может приводить к скрытым багам. Например, сравнение 0 == "foo" в PHP 8 вернёт false, а в PHP 7 - true, потому что строка приводилась к числу 0.

Для надёжного кода рекомендуется:

  • Использовать declare(strict_types=1) в каждом файле.
  • Явно приводить типы при работе с внешними данными (HTTP-запросы, БД).
  • Использовать typed properties и return types.
  • Для строгих сравнений использовать === и !==.

При работе с массивами и объектами несовпадение типов часто проявляется как TypeError при передаче array вместо Traversable или наоборот. Также важно помнить, что null не является допустимым значением для типизированных параметров без ? перед типом.

Пример кода

PHP
<?php
// Файл без strict_types - слабый режим
function add(int $a, int $b): int {
return $a + $b;
}
echo add("5", 3); // 8, строка "5" приведена к int
// Попытка передать нечисловую строку
try {
echo add("abc", 3);
} catch (TypeError $e) {
echo $e->getMessage(); // add(): Argument #1 ($a) must be of type int, string given
}
PHP
<?php
declare(strict_types=1);
// Строгий режим
function add(int $a, int $b): int {
return $a + $b;
}
try {
echo add("5", 3); // TypeError
} catch (TypeError $e) {
echo "TypeError: " . $e->getMessage();
}
PHP
<?php
// Typed properties
class User {
public int $id;
public string $name;
}
$user = new User();
$user->id = "42"; // TypeError в PHP 8, в PHP 7.4 - TypeError тоже

Как отвечать на собеседовании

Начните с короткого определения динамической типизации и двух режимов. Затем объясните разницу между слабым и строгим режимами, приведите пример неявного приведения. Упомяните, что проверка типов происходит в рантайме, а не на этапе компиляции. Покажите понимание TypeError и отличий PHP 7 от PHP 8 (например, изменение поведения сравнения 0 == "foo"). Если спросят про производительность - отметьте, что проверка типов добавляет небольшие накладные расходы, но в PHP 8 они минимальны.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание динамической типизации и её последствий.
  • Знание declare(strict_types=1) и области его действия.
  • Умение объяснить разницу между неявным приведением и TypeError.
  • Понимание typed properties и их поведения.
  • Осведомлённость об изменениях в PHP 8 (например, get_debug_type(), изменение сравнений).

Типичные ошибки

  • Утверждение, что PHP - строго типизированный язык.
  • Незнание, что strict_types действует только на вызовы функций, а не на операторы.
  • Путаница между == и === при объяснении проверки типов.
  • Утверждение, что "abc" при приведении к int всегда даёт 0 - в PHP 8 это TypeError в контексте функции с типом int.
  • Игнорирование TypeError для typed properties - некоторые кандидаты думают, что свойства приводят типы автоматически.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью