В чем разница между строгой и нестрогой (слабой) типизацией в PHP?

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

Ответ

PHP исторически является языком со слабой (нестрогой) динамической типизацией, но с версии 7.0 поддерживает режим строгой типизации.

Аспект Нестрогая типизация (по умолчанию) Строгая типизация (declare(strict_types=1))
Приведение типов Неявное, автоматическое. Запрещено для скалярных типов в сигнатурах функций.
Обработка несоответствия PHP попытается привести аргумент к ожидаемому типу. Выбрасывается исключение TypeError.
Объявление Работает по умолчанию. Требует директивы в начале файла.

Пример:

// Файл без strict_types (нестрогий режим)
function add(int $a, int $b): int {
    return $a + $b;
}
echo add("10", 5.5); // PHP приведёт "10" к 10, а 5.5 к 5. Результат: 15

// Файл с strict_types (строгий режим)
declare(strict_types=1);
function addStrict(int $a, int $b): int {
    return $a + $b;
}
// echo addStrict("10", 5); // Вызовет Fatal TypeError, т.к. строка "10" не является int

Практика: Использование strict_types=1 делает код более предсказуемым, предотвращает скрытые ошибки приведения типов и считается best practice для новых проектов.