Сам PHP обновить несложно. Сложно то, что после этого перестаёт работать код, написанный под старые версии: свои доработки, купленные модули, шаблоны. Вот что мы исправляем чаще всего — с примерами из наших переходов.
01
Нестатические методы в статическом вызове
Обработчики событий и методы классов, объявленные без static, но вызываемые как статические. В PHP 8 это фатальная ошибка.
function OnBuildGlobalMenu()
static function OnBuildGlobalMenu()
Из практики: в интернет-магазине из-за одного такого обработчика не открывалась админка, а бонусные агенты молча не работали с октября 2023 года.
02
Фигурные скобки для доступа к строке
Синтаксис $str{0} удалён в PHP 8.0. Файл с такой строкой не загружается целиком — вместе со всем, что в нём объявлено.
$path{$len-1}
$path[$len-1]
Из практики: в платёжном модуле из-за одной такой строки падала форма оплаты картой — покупатель видел ошибку на последнем шаге.
03
Передача null и неверных типов
count(), in_array(), строковые функции больше не прощают null и массивы там, где ждут строку. Предупреждение стало ошибкой.
count($arResult["ITEMS"])
count($arResult["ITEMS"] ?? [])
Где встречается: шаблоны компонентов, result_modifier.php, обработчики форм.
04
Удалённые функции и старый синтаксис
each(), create_function(), обратный порядок аргументов implode() и другое, что годами выдавало предупреждения, в PHP 8 удалено.
while (list($k, $v) = each($arr))
foreach ($arr as $k => $v)
Где встречается: старые модули и доработки времён PHP 5.
05
Закодированные модули
Модули, защищённые ionCube, работают только на тех версиях PHP, под которые их закодировал автор. Исправить такой код нельзя — нужна новая версия от разработчика или замена.
Из практики: на тестовом переключении модуль фильтра магазина отказался загружаться — нашли это на копии, а не на рабочем сайте.
06
Крон, консоль и расширения
Сайт работает на новом PHP, а задачи по расписанию — на старом из консоли. Или в новой версии не включены нужные расширения: mysqli, mbstring, gd.
Из практики: у магазина сайт работал на PHP 8.2, а все задания крона 1С-Битрикс запускались на 7.4 и падали — агенты и рассылки стояли.