В чем разница между строгой и нестрогой (слабой) типизацией в 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 для новых проектов.

Ответ 18+ 🔞

Да ты посмотри, какой прикол! PHP, этот старый добрый язык, который всех нас выкормил, изначально был таким вот раздолбаем — типы у него были слабые, динамические, и он мог на лету превратить строку в число, лишь бы код не упал. Но потом, видимо, разработчики охуели от этих его фокусов и с седьмой версии добавили режим строгой типизации. Ну, чтоб как большие.

Вот смотри, в чём разница, чтобы не путаться:

Штука Нестрогая типизация (как обычно) Строгая типизация (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. Магия, блядь.
// А теперь файл со строгой типизацией
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 — это как ремень безопасности. Код становится предсказуемее, скрытые костыли и преобразования не вылезут в самый неподходящий момент, и в целом это сейчас считается хорошим тоном для новых проектов. Хули тут думать — включай и живи спокойно.