Ответ
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 — это как ремень безопасности. Код становится предсказуемее, скрытые костыли и преобразования не вылезут в самый неподходящий момент, и в целом это сейчас считается хорошим тоном для новых проектов. Хули тут думать — включай и живи спокойно.