PHP 8.5: Отказ от устаревших приведений типов `(boolean, double, integer, binary)`
В 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 insteadPHP 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 srcPHPStan автоматически обнаружит все использования устаревших приведений типов и выведет подробные сообщения об ошибках.
Использование 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, сделав систему типизации более предсказуемой и логичной.
Таким образом, данное обновление способствует повышению качества кода и облегчает его поддержку в долгосрочной перспективе.