С какими проблемами сталкиваешься при переходе с одной версии PHP на другую

Ответ

При миграции проектов с PHP 7.4 на 8.x я сталкивался со следующими основными проблемами:

  1. Критические изменения в ядре языка. Наиболее болезненным было изменение поведения некоторых функций, например, строгий режим для арифметических и побитовых операций с типами, отличными от int/float. Это приводило к TypeError в местах, где раньше работало неявное приведение.

    // В PHP 7.4: Работало, результат '50'
    // В PHP 8.0: Выбрасывается TypeError
    $result = '5' * '10';
  2. Удаление устаревших (deprecated) функций и конструкций. Например, при переходе на PHP 8.0 нужно было заменить create_function() на анонимные функции, а в PHP 8.1 — убрать все вызовы устаревших mysqli и PDO сигнатур.

  3. Несовместимость сторонних расширений и библиотек. Некоторые PECL-расширения (например, mongodb в определенных версиях) или даже композер-пакеты, не обновленные для PHP 8, переставали работать.

  4. Изменения в стандартной библиотеке (SPL). Некоторые классы, такие как ArrayObject, стали более строгими в отношении типов при сериализации.

Мой подход к обновлению:

  • Первым делом запускаю статический анализ через PHPCompatibility (в связке с phpcs) для всего кодовой базы.
  • Поднимаю отдельное тестовое окружение (staging) с новой версией PHP и запускаю полный набор юнит- и интеграционных тестов.
  • Включаю режим error_reporting(E_ALL); и внимательно изучаю лог-файлы на предмет предупреждений и уведомлений, которые в новой версии могли стать ошибками.
  • Для legacy-проектов без покрытия тестами использую стратегию «двойного запуска»: постепенно перевожу на новую версию наименее загруженные части приложения, тщательно мониторя логи и метрики.

Ответ 18+ 🔞

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

Слушай, основные грабли, на которые наступают все, как один:

  1. Ядро языка решило поумнеть. Раньше можно было строки друг на друга умножать, и тебе бы тихонечко число подсунули. Теперь нет, ёпта! Теперь будет TypeError и требование, чтобы ты в своем уме был. Как будто на дворе 2002-й год, и все вдруг стали педантичными бухгалтерами.

    // Раньше: '5' * '10' = 50. Магия, хуле.
    // Теперь: Ты чё, мудила, строки перемножаешь? Иди нахуй с такими запросами.
    $result = '5' * '10'; // БАБАХ! TypeError.
  2. Выкинули весь старый хлам. Функции, которые лет десять как гробили, наконец-то прибили. create_function() — отдыхает. Теперь только анонимные, красавчик. И всякие старые сигнатуры у mysqli — тоже в утиль. Библиотекари пришли и вынесли весь хлам с чердака.

  3. Расширения отваливаются. Это вообще отдельная песня. Какая-нибудь библиотека или PECL-расширение, которое последний раз обновляли при царе Горохе, просто накрывается медным тазом. Заходишь на сайт — а там поддержка только до 7.4. И сидишь, такой, с круглыми глазами: «И чё теперь делать?». Волнение ебать.

  4. Стандартные классы застегнулись на все пуговицы. Тот же ArrayObject стал такой принципиальный, когда дело доходит до типов и сериализации. Раньше проглотил бы что угодно, а теперь — «нет, я так не играю, соблюдайте протокол».

А вот как я это делаю, чтобы не сойти с ума:

  • Первым делом — статический анализатор. Беру PHPCompatibility, натравиваю на всю кодобазу и смотрю, где он матерится. Он, блядь, как рентген, все кости показывает. Все несовместимости — на блюдечке.
  • Дальше — тестовый полигон. Поднимаю staging, ставлю новую пыху и запускаю ВСЕ тесты. Если тестов нет — это уже пиздец, а не миграция. Тогда сразу иди пить.
  • Включаю параноидальный режим логирования. error_reporting(E_ALL); — и вжух! Все предупреждения, которые раньше были тихим шёпотом, теперь орут как резаные. Сидишь и читаешь логи, как детектив.
  • Для легаси-проектов (где тестов — ноль) — тактика партизана. Беру самый незначительный, не нагруженный кусок приложения, перевожу его на новую версию и смотрю, не развалилось ли всё. Мониторю логи, метрики, молюсь богам. Если выжил — иду дальше. Медленно, печально, но иду.

Короче, процесс это долгий и нудный. Но если делать по уму, а не втыкать новую версию в прод в пятницу вечером, то можно и не поседеть. Хотя, блядь, поседеешь всё равно, просто меньше.