Какая будет ошибка, если сложить число со строкой в PHP?

«Какая будет ошибка, если сложить число со строкой в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP не возникнет ошибки (исключения) в классическом понимании. Вместо этого интерпретатор попытается выполнить неявное приведение типов (type juggling).

Правила преобразования:

  • Если строка начинается с допустимого числового значения (включая научную нотацию, например, "12e3"), она будет преобразована в это число.
  • Если строка не начинается с числа, она преобразуется в 0 (ноль).
  • Если строка является числовой, но содержит посторонние символы в конце, будет взято начальное числовое значение.

Примеры:

// Строка, начинающаяся с числа
var_dump(5 + "10");        // int(15)
var_dump(5 + "10.5abc");   // float(15.5) - берется начальное число 10.5

// Строка, не начинающаяся с числа
var_dump(5 + "abc10");     // int(5) - "abc10" -> 0
var_dump(5 + "");          // int(5) - пустая строка -> 0

// Строка с пробелами
var_dump(5 + "  42  ");    // int(47) - пробелы игнорируются

Проблема и best practice: Такое поведение может привести к трудноуловимым багам. Для безопасных операций следует:

  1. Проверять типы данных перед операцией:
    if (is_numeric($string)) {
        $result = $number + (float) $string;
    }
  2. Использовать строгое сравнение (===, !==), которое проверяет и значение, и тип.
  3. Включать режим строгих типов declare(strict_types=1);, который запретит неявное приведение для скалярных типов в объявленных функциях.