← Назад к вопросам

Какая область действия у директивы strict_types?

2.0 Middle🔥 91 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Область действия директивы strict_types в PHP

Директива declare(strict_types=1); в PHP имеет область действия на уровне файла, где она объявлена, и влияет только на вызовы функций и методов, которые происходят из этого конкретного файла.

Ключевые особенности области действия

Область действия на уровне файла:

  • Директива действует только в файле, где она объявлена, и не распространяется на другие файлы, подключенные через include, require или автозагрузку.
  • Каждый PHP-файл может иметь собственную настройку strict_types независимо от других.

Влияет на вызовы, а не на объявления:

  • Строгая типизация проверяет типы переданных аргументов и возвращаемых значений при вызове функций/методов, определённых в этом файле.
  • Объявления функций в других файлах подчиняются настройкам strict_types того файла, откуда происходит вызов.

Практические примеры

Пример 1: Базовое использование

// File: strict.php
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

// Этот вызов будет проверен строго
add(5, 3); // OK
add(5.5, 3); // TypeError: аргумент должен быть типа int

Пример 2: Взаимодействие между файлами

// File: lib.php
function multiply(int $a, int $b): int {
    return $a * $b;
}

// File: index.php
declare(strict_types=1);

require_once 'lib.php';

// Вызов функции из lib.php БУДЕТ проверяться строго,
// потому что вызов происходит из index.php
multiply(5, 3); // OK
multiply(5.5, 3); // TypeError

Пример 3: Разные настройки в разных файлах

// File: utils.php
declare(strict_types=1);

function strictDivide(int $a, int $b): float {
    return $a / $b;
}

// File: main.php
// Без strict_types (по умолчанию weak typing)

require_once 'utils.php';

// Вызов из main.php НЕ будет строгим для функций из utils.php
strictDivide(10, 3); // OK
strictDivide(10.5, 3); // OK в weak mode, преобразуется к int

Важные нюансы

  1. Позиция в файле: Директива declare(strict_types=1) должна быть первой строкой в файле (после <?php), до любого другого кода, кроме комментариев.

  2. Только для скалярных типов: Строгая типизация применяется только к:

    • int
    • float
    • string
    • bool
    • array
    • Объектным типам (имена классов/interfaces)
    • iterable
    • callable
    • Составным типам и mixed
  3. Не влияет на внутренние функции PHP: strict_types влияет только на пользовательские функции и методы, но не на внутренние функции PHP.

  4. Наследование и интерфейсы: При реализации интерфейсов или наследовании классов, строгая типизация файла, где происходит вызов, определяет поведение проверки типов.

Рекомендации по использованию

  • Консистентность: Лучше использовать strict_types=1 во всех файлах проекта для предсказуемого поведения.
  • Явное приведение типов: В режиме строгой типизации используйте явное приведение:
    declare(strict_types=1);
    
    function process(int $value): void {
        // ...
    }
    
    $input = "42";
    process((int)$input); // Явное приведение типа
    
  • Автозагрузка: При использовании автозагрузчика (Composer), каждый загружаемый файл будет использовать свои собственные настройки strict_types.

Вывод: Область действия strict_types ограничена файлом, что обеспечивает гибкость при интеграции кода с разными настройками типизации, но требует внимательности при проектировании архитектуры приложения.