Ответ
Директива declare(strict_types=1); включает режим строгой типизации (strict types) для скалярных типов в конкретном PHP-файле. Она должна быть объявлена самой первой строкой в файле, до любого другого кода (кроме <?php).
Что меняется при включении strict_types=1:
PHP перестаёт выполнять неявные, потенциально опасные преобразования типов для аргументов функций и возвращаемых значений, которые используют скалярные type hints (int, float, string, bool). Вместо этого происходит строгая проверка на точное соответствие.
Сравнительный пример:
// ФАЙЛ БЕЗ strict_types (поведение по умолчанию)
function add(int $a, int $b): int {
return $a + $b;
}
echo add("10", 5.5); // Выведет 15
// PHP неявно приводит "10" к 10, а 5.5 к 5.
// ФАЙЛ СО strict_types=1
<?php
declare(strict_types=1); // Критически важная строка
function add(int $a, int $b): int {
return $a + $b;
}
echo add("10", 5.5); // TypeError! Аргумент 1 должен быть типа int, string передано.
Ключевые особенности:
- Файловая область видимости: Директива действует только на файл, в котором она объявлена. Если файл A с
strict_types=1вызывает функцию из файла B без этой директивы, для вызова из A будут применяться строгие правила, но внутри B — нет. - Только для пользовательских функций: Не влияет на встроенные функции PHP (например,
strlen()илиarray_merge). - Выбрасывает TypeError: При несоответствии типа выбрасывается исключение
TypeError, которое можно отловить.
Практическая польза:
- Предотвращение скрытых багов: Исключает неочевидные преобразования, которые могут исказить логику (например, строка
"123abc"станет числом123). - Повышение читаемости: Код становится более предсказуемым — типы в сигнатуре функции точно описывают, что она принимает и возвращает.
- Подготовка к современному PHP: Строгая типизация — стандарт в современной разработке на PHP, особенно в сочетании с инструментами статического анализа (Psalm, PHPStan).
Рекомендация: Всегда использовать declare(strict_types=1); в новых проектах и при рефакторинге legacy-кода для повышения его надёжности.