Что такое директива declare(strict_types=1) в PHP?

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

Ответ

Директива 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, которое можно отловить.

Практическая польза:

  1. Предотвращение скрытых багов: Исключает неочевидные преобразования, которые могут исказить логику (например, строка "123abc" станет числом 123).
  2. Повышение читаемости: Код становится более предсказуемым — типы в сигнатуре функции точно описывают, что она принимает и возвращает.
  3. Подготовка к современному PHP: Строгая типизация — стандарт в современной разработке на PHP, особенно в сочетании с инструментами статического анализа (Psalm, PHPStan).

Рекомендация: Всегда использовать declare(strict_types=1); в новых проектах и при рефакторинге legacy-кода для повышения его надёжности.