Логотип HuTor Tech HuTor Tech
← Усі записи

· hutor.tech

Як перейти з PHP 7 на PHP 8

Як перейти з PHP 7 на PHP 8

Міграція на PHP 8 рідко буває драматичною, але ніколи не буває автоматичною. Більша частина роботи — знайти ті кілька місць, де мова перестала пробачати неохайний код, а решта — переконатися, що залежності поїхали разом з вами.

Починайте із залежностей, а не з власного коду. Виконайте `composer why-not php 8.2` (або ту версію, на яку йдете) — і отримаєте список пакетів, що блокують оновлення. Оновіть їх першими, ще на PHP 7, окремими комітами. Міграцію, яка одночасно змінює середовище виконання і двадцять пакетів, неможливо розібрати, коли щось зламається.

Далі хай статичний аналізатор знайде справжні несумісності. PHPCompatibility для PHP_CodeSniffer або Rector із наборами правил для PHP 8 покажуть змінені конструкції:
— `match` і `enum` стали зарезервованими словами;
— порівняння рядка з числом підпорядковується розумнішим правилам, тож `0 == "foo"` тепер хибне;
— передавання null у ненульовані параметри вбудованих функцій оголошено застарілим;
— `create_function`, `each` і сімейство `mysql_*` зникли остаточно;
— багато notice стали warning, а warning — помилками.

Саме зміна правил порівняння б'є в бойових умовах. Код, що тихо покладався на істинність `"abc" == 0`, тепер піде іншою гілкою, і жодної помилки не буде. Пройдіться пошуком по нестрогих порівняннях навколо введення користувача, ідентифікаторів і кодів статусу — і додайте тести до зміни середовища, а не після.

Перемикайтеся на тестовому сервері, що дзеркалить бойовий: ті самі розширення, ті самі налаштування пулу PHP-FPM, та сама конфігурація OPcache. Увімкніть виведення помилок, прогоніть застосунок і читайте лог, а не екран: більшість проблем PHP 8 приходить як застарілі попередження задовго до того, як прийде як падіння.

Опинившись на 8.x, витратьте день на здобутки: просування властивостей у конструкторі, іменовані аргументи, `match`, оператор `?->` і, що важливіше, помітно швидший рушій навіть без JIT. Не переписуйте все — застосовуйте новий синтаксис там, де й так торкаєтеся коду, інакше міграція перетвориться на переписування і ви втратите можливість відкотитися.

Тримайте план відкату до кінця першого спокійного тижня: попередня версія PHP, встановлена поруч, можливість повернути пул на неї і база, яку не змінили так, щоб старий код її вже не прочитав.