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

Что такое strict_types?

1.8 Middle🔥 181 комментариев
#PHP Core

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

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

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

Что такое strict_types в PHP?

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

Основная цель и принцип работы

Цель — предотвратить неявные, потенциально опасные преобразования типов, сделав код более предсказуемым и менее подверженным скрытым ошибкам.

Принцип работы: Директива действует на уровне файла, где она объявлена, и влияет только на вызовы функций, которые определены в этом же файле. Это означает, что строгость типов не распространяется на встроенные функции PHP или функции из других файлов, если они не имеют собственного объявления strict_types.

Ключевые отличия строгого режима от нестрогого

1. Обработка скалярных типов (int, float, string, bool)

В нестрогом режиме PHP попытается привести переданное значение к ожидаемому типу, если это возможно.

// Без strict_types
function sum(int $a, int $b): int {
    return $a + $b;
}

echo sum("10", 5.5); // Выведет 15. Строка "10" приведена к 10, 5.5 к 5.

В строгом режиме такие неявные приведения вызовут TypeError.

declare(strict_types=1);

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

// sum("10", 5.5); // Выбросит Fatal TypeError
echo sum(10, 5); // Корректно. Выведет 15.

2. Возвращаемые значения

Строгость также применяется к типам, указанным для возвращаемого значения.

declare(strict_types=1);

function getNumber(): int {
    return "100"; // TypeError: Return value must be of type int, string returned
}

Практические примеры и важные нюансы

Область действия (file scope) — это самый важный нюанс.

// Файл: lib.php
declare(strict_types=1);

function strictFunction(int $x): int {
    return $x * 2;
}
// Файл: index.php
// Без declare(strict_types=1);
include 'lib.php';

// Вызов функции из другого файла ПОДЧИНЯЕТСЯ правилам текущего файла (index.php).
// Поскольку здесь strict_types не включен, PHP попытается привести типы.
echo strictFunction("10"); // Выведет 20, ошибки не будет!

Это демонстрирует, что строгость проверяется в точке вызова, а не в точке объявления функции.

Преимущества использования strict_types

  • Предсказуемость кода: Исключаются неочевидные преобразования, например, строки "123abc" в число 123.
  • Раннее выявление ошибок: Ошибки типов обнаруживаются сразу на этапе вызова функции, а не в процессе вычислений.
  • Повышение качества кода: Требует от разработчика явного контроля над типами данных.
  • Улучшенная читаемость: Сигнатуры функций точно отражают их контракт.
  • Подготовка к современным практикам: Является обязательным условием для эффективного использования инструментов статического анализа (Psalm, PHPStan) и систем типов более высокого уровня.

Когда следует использовать?

  • В новых проектах рекомендуется использовать везде. Это современный стандарт разработки на PHP.
  • При работе с предметно-ориентированным дизайном (DDD) и богатыми моделями, где целостность данных критична.
  • При интеграции с внешними API или системами, где формат данных должен строго соблюдаться.
  • Для библиотек и пакетов, чтобы обеспечить четкий контракт для пользователей.

Ограничения

  • Не влияет на внутренние функции PHP (например, strlen() или array_sum). Их поведение остается неизменным.
  • Не является "полной строгой типизацией". PHP остается языком с динамической типизацией — типы переменных могут меняться в процессе выполнения. strict_types регулирует только передачу данных в функции и методы, а также возврат из них.
  • Требует дисциплины от разработчика, так как нужно явно приводить типы там, где это необходимо.

Пример безопасного явного приведения в строгом режиме:

declare(strict_types=1);

function processUserId($input): void {
    // Явное и контролируемое приведение типа
    $id = (int) $input;
    saveToDatabase($id);
}

function saveToDatabase(int $id): void {
    // Логика сохранения...
}

Вывод

declare(strict_types=1); — это не опция, а необходимый инструмент для написания надежного, поддерживаемого промышленного кода на современном PHP. Он смещает акцент с "кода, который работает как-нибудь" на "код, который работает точно так, как задумано", предотвращая целый класс трудноуловимых ошибок, связанных с типами данных. Его использование является признаком профессиональной разработки.

Что такое strict_types? | PrepBro