declare(strict_types=1)
Тема дорожной карты · PHP Developer
declare(strict_types=1); — директива PHP, отключающая автоматическое приведение скалярных типов на границе вызова функции. По умолчанию PHP в режиме «coercive» сам конвертирует аргументы: передали "42" в функцию с int-параметром — PHP молча превратит строку в число. В strict-режиме то же действие выбрасывает TypeError. Директива ставится первой строкой каждого PHP-файла (она работает per-file и не наследуется include-ами); современные команды требуют её через phpstan/psalm на максимальном уровне и enforced правилом php-cs-fixer. Эффект — баги ловятся при разработке, а не на проде, где "abc" тихо стал нулём в финансовом расчёте.
Как это работает
Директива срабатывает на вызывающей стороне: если вызываемый код в strict-файле — но вызывающий в coercive — PHP всё равно применит strict-правила. Это значит, что добавление declare(strict_types=1); в библиотечный код может сломать клиентов, которые передавали неточные типы. Возвращаемые значения тоже проверяются строго: функция, объявленная как возвращающая int, не сможет вернуть "7" без TypeError. Скаляры (int, float, string, bool) проверяются жёстко; объекты, массивы и void всегда строгие независимо от режима.
Когда применять
Включайте во всех новых файлах. Для legacy-кодовых баз вводите автоматизированно: php-cs-fixer имеет правило declare_strict_types, которое расставит директивы массово. Связка с phpstan level 8 или psalm level 1 ловит несоответствия типов ещё до запуска. В фреймворках Laravel и Symfony большая часть нового ядра уже идёт со strict-types — следуйте конвенции.
Типичные ошибки
Самая частая: добавили директиву в один файл, забыли передать в зависимые — TypeError всплывает в неожиданном месте. Вторая: путают coercive-обработку на сторонах вызова и определения — strict-режим определяется файлом вызывающего, не определяющего. Третья: использование mixed или unionтипов как способа обойти strict вместо честной типизации API.