PHP 8.5: Отказ от устаревших приведений типов `(boolean, double, integer, binary)`

В PHP 8.5 типы `(boolean)`, `(double)`, `(integer)` и `(binary)` объявлены устаревшими: при использовании этих типов теперь выводятся предупреждения `E_DEPRECATED`. Эти альтернативные имена использовались параллельно с каноническими `(bool)`, `(float)`, `(int)` и `(string)`, но в PHP 9.0 они будут удалены. Рассмотрим, почему принято такое решение, как это затронет ваш код и как подготовиться к переходу.

В PHP преобразование скалярных типов допускает некоторые вариации скалярных типов. Например, можно преобразовать переменную в целое число с помощью преобразований (integer) и (int):

$value = '42';

(integer) $value; // int(42)
(int) $value; // int(42)

Скалярные типы PHP допускают следующие альтернативные варианты:

ТипКаноническое имя типаАльтернативное имя типа
Целые числа(int)(integer)
Числа с плавающей точкой(float)(double)
Логические значения(bool)(boolean)
Строки(string)(binary)

Альтернативные имена типов не поддерживаются в типах параметров, возвращаемых значений или свойств:

function test(integer $value): double {}

// Warning: "double" will be interpreted as a class name. Did you mean "float"? Write "\double" to suppress this warning in ... on line ...
// Warning: "integer" will be interpreted as a class name. Did you mean "int"? Write "\integer" to suppress this warning in ... on line ...

Из-за этой несогласованности в PHP 8.5 четыре альтернативных имени скалярных типов, указанных выше, объявлены устаревшими.

В PHP 8.5 (см. обзор новых функций и изменений) и более поздних версиях серии PHP 8.x использование устаревших приведений типов вызывает предупреждение об устаревании:

(integer) $value

// Deprecated: Non canonical cast (integer|boolean|double|binary) is deprecated, use the (int|bool|float|string) cast instead

PHP 9.0 и более поздние версии больше не будут распознавать приведения типов (integer|boolean|double|binary) и будут рассматривать их как приведение к классу с тем же именем.

Рекомендуемая замена

Чтобы избежать объявления об устаревании, замените приведение типов на канонический скалярный тип:

-(integer) $value; // int(42)
+(int) $value; // int(42)

-(double) $value; // float(42)
+(float) $value; // float(42)

-(boolean) $value; // bool(true)
+(bool) $value; // bool(true)

-(binary) $value; // string(3) "foo"
+(string) $value; // string(3) "foo"

Влияние на обратную совместимость

Изменение вводит новое уведомление об устаревании для каждой операции приведения альтернативных скалярных типов. Оно выводится во время выполнения, а не во время компиляции.

(integer) $value;

// PHP Deprecated: Non-canonical cast (integer) is deprecated, use (int) cast instead in /path/to/file.php on line X

При этом замена устаревших имён скалярных типов на канонические является обратно совместимым изменением и не должна влиять на работу существующего кода.

Автоматическое обнаружение устаревших приведений типов

Использование PHPStan

Добавьте правило для обнаружения устаревших приведений в конфигурационный файл phpstan.neon:

parameters:
...
level: 8
checkDeprecated: true
checkDeprecatedCode: true
...

Запустите анализ:

vendor/bin/phpstan analyse src

PHPStan автоматически обнаружит все использования устаревших приведений типов и выведет подробные сообщения об ошибках.

Использование Psalm

Добавьте правила в конфигурационный файл psalm.xml:

<psalm>
...
<issueHandlers>
<DeprecatedCode errorLevel="info" />
</issueHandlers>
...
</psalm>

Запустите анализ:

vendor/bin/psalm

Рекомендации по поэтапному обновлению

Прежде всего, важно правильно подготовиться к процессу обновления. Начните с тщательного анализа проекта — просмотрите весь код и составьте список мест, где используются устаревшие приведения типов. Оцените, насколько критичны эти изменения для работы системы.

После анализа переходите к планированию. Разделите код на логические блоки по приоритету: сначала обновите менее важные части, чтобы набраться опыта, а затем переходите к критическим компонентам системы.

В процессе обновления активно используйте современные инструменты разработки. Современные IDE (например, PhpStorm) помогут автоматически найти и заменить устаревшие типы. Не забывайте запускать тесты после каждого изменения — это поможет убедиться, что всё работает корректно.

Особое внимание уделите тестированию. Запустите весь набор тестов в разных окружениях: локально, на тестовом сервере и в продакшене. Проведите нагрузочное тестирование, чтобы убедиться, что обновлённый код справляется с реальной нагрузкой.

Помните, что обновление — это процесс, который требует времени и внимания. Не спешите и делайте всё постепенно, проверяя каждый шаг. Такой подход поможет избежать серьёзных проблем и сделать переход на новые стандарты максимально плавным.

Следуя этим рекомендациям, вы сможете успешно обновить свой проект и подготовить его к будущим версиям PHP.

Заключение

В PHP 8.5 был сделан важный шаг к унификации системы типизации — альтернативные имена приведений типов (boolean), (double), (integer) и (binary) объявлены устаревшими. Это решение направлено на устранение противоречий в языке и обеспечение единообразия при работе с типами данных.

Основная причина устаревания заключается в несогласованности использования альтернативных имён: они работали только при приведении значений, но не поддерживались при объявлении типов параметров, возвращаемых значений и свойств классов. Такая фрагментация создавала путаницу и нарушала принцип консистентности в языке.

В PHP 9.0 поддержка устаревших приведений будет полностью прекращена. Разработчикам рекомендуется перейти на использование канонических имён типов: (bool), (float), (int) и (string). Это изменение не только устранит потенциальные ошибки в коде, но и упростит дальнейшее развитие PHP, сделав систему типизации более предсказуемой и логичной.

Таким образом, данное обновление способствует повышению качества кода и облегчает его поддержку в долгосрочной перспективе.

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: Новая константа PHP_BUILD_DATE