Ответ
При миграции проектов с PHP 7.4 на 8.x я сталкивался со следующими основными проблемами:
-
Критические изменения в ядре языка. Наиболее болезненным было изменение поведения некоторых функций, например, строгий режим для арифметических и побитовых операций с типами, отличными от
int/float. Это приводило кTypeErrorв местах, где раньше работало неявное приведение.// В PHP 7.4: Работало, результат '50' // В PHP 8.0: Выбрасывается TypeError $result = '5' * '10'; -
Удаление устаревших (deprecated) функций и конструкций. Например, при переходе на PHP 8.0 нужно было заменить
create_function()на анонимные функции, а в PHP 8.1 — убрать все вызовы устаревшихmysqliиPDOсигнатур. -
Несовместимость сторонних расширений и библиотек. Некоторые PECL-расширения (например,
mongodbв определенных версиях) или даже композер-пакеты, не обновленные для PHP 8, переставали работать. -
Изменения в стандартной библиотеке (SPL). Некоторые классы, такие как
ArrayObject, стали более строгими в отношении типов при сериализации.
Мой подход к обновлению:
- Первым делом запускаю статический анализ через
PHPCompatibility(в связке сphpcs) для всего кодовой базы. - Поднимаю отдельное тестовое окружение (staging) с новой версией PHP и запускаю полный набор юнит- и интеграционных тестов.
- Включаю режим
error_reporting(E_ALL);и внимательно изучаю лог-файлы на предмет предупреждений и уведомлений, которые в новой версии могли стать ошибками. - Для legacy-проектов без покрытия тестами использую стратегию «двойного запуска»: постепенно перевожу на новую версию наименее загруженные части приложения, тщательно мониторя логи и метрики.