Если ваша версия OpenCart ниже 3.0.3.9, то ваша система не совместима с PHP 8. К сожалению, в OpenCart 3 нет автоматического обновления, чтобы можно было перейти на самую новую на данный момент версию 3.0.4.0. Тем не менее проблему совместимости можно решить, сделав адаптацию старой версии OpenCart под требования PHP 8.x.
Наша инструкция предназначена для OpenCart 3.0.2.0, 3.0.3.1, 3.0.3.2, 3.0.3.3, 3.0.3.5, 3.0.3.6, 3.0.3.7, 3.0.3.8. Не забудьте сделать полную резервную копию сайта перед выполнением операций.
Существует несколько методов обновления старой версии OpenCart 3.0 для поддержки PHP 8:
- Клонировать библиотеки и отдельные файлы OpenCart из самой новой сборки в вашу систему
- Сделать обновление библиотек через composer и внести некоторые правки.
- Создать новый сайт на OpenCart 3.0.4.0 и перенести шаблон, базу данных и все модули на новую систему.
Метод 1. Клонирование файлов из самой новой сборки OpenCart 3
Этот метод является самым простым и быстрым, вот что нужно сделать:
- Нужно скачать самую новую версию OpenCart 3, на данный момент это 3.0.4.0
- Распаковать скачанный архив у себя на ПК и открыть папку upload
- Скопировать папку system на ваш сайт, с заменой соответствующих папок и файлов
- Скопировать папку system/storage на ваш сайт в ваш каталог 'storage' (у вас он может находиться за пределами каталог домена, поскольку OpenCart после установки требует переместить storage за пределы каталога домена). Если вы не знаете, где у вас находится storage, откройте config.php и найдите DIR_STORAGE.
- Скопировать с заменой файл catalog/controller/event/theme.php
- Исправить мелкие ошибки PHP (перечень возможных ошибок и исправления смотрите ниже)
Метод 2. Обновление библиотек через composer через терминал
- Определить размещение каталога storage на вашем сайте - откройте config.php и найдите DIR_STORAGE, там указан путь к каталогу.
- Загрузите в этот каталог файл composer.json (скачать)
- Откройте терминал (консоль) на сервере и выполните последовательно следующие команды:
cd путь/к/каталогу/storage
composer update - Если у вас OpenCart ниже 3.0.3.7 - нужно заменить некоторые файлы системы:
catalog/controller/event/theme.php (скачать)
system/library/template/twig.php (скачать) - Исправить мелкие ошибки PHP (перечень возможных ошибок и исправления смотрите ниже)
Метод 3. Новый сайт с миграцией данных
Это, пожалуй, самый сложный метод, поскольку требует создания нового сайта с последовательным переносом всех данных. Мы не советуем рассматривать этот метод поскольку он равноценен созданию нового сайта. В таком случае можно разработать сайт на новой сборке, на данный момент это OpenCart 4.1.0.3, и получить полную совместимость с PHP 8, а также использование более новых библиотек и фреймворков.
Если вы все таки решили сделать миграцию на новый сайт на OpenCart 3 с совместимостью с PHP 8, вот краткая инструкция:
- Скачать и установить самую новую версию OpenCart 3, на данный момент это 3.0.4.0.
- Подменить базу данных на вашу - удалить все таблицы и импортировать ваш дамп базы данных.
- Скопировать папку image с вашего старого сайта на новый
- Установить шаблон и все необходимые модули для OpenCart 3.
Перечень возможных ошибок PHP и их исправление
После перехода OpenCart 3.0 на новые версии PHP, особенно PHP 8.0, 8.1, 8.2, 8.3, 8.4, часто появляются ошибки, предупреждения (warnings) и устаревшие сообщения (deprecations). Это связано с тем, что OpenCart 3 создавался еще для PHP 7.0-7.3. Ниже приведем самые распространенные ошибки, их объяснения и рекомендации:
Unknown: mysqli::real_escape_string(): Passing null to parameter #1 ($string) of type string is deprecated in /system/library/db/mysqli.php on line 46
Причина: в PHP 8.1+ нельзя передавать null вместо обязательного параметра string.
Решение: добавить проверку или приведение типа проблемной переменной:
return $this->connection->real_escape_string($value);
заменяем на:
return $this->connection->real_escape_string((string)$value);
Unknown: round(): Passing null to parameter #1 ($num) of type int|float is deprecated in /catalog/model/catalog/product.php on line 45
Причина: в PHP 8 вызов round(null) больше не допускается - null не является допустимым типом аргумента.
Решение: Перед вызовом round() нужно убедиться, что аргумент не является null или сделать приведение типа:
'rating' => round($query->row['rating']),
заменяем на:
'rating' => round((float)$query->row['rating']),
Unknown: Automatic conversion of false to array is deprecated in /system/library/cart/user.php on line 43
Причина: Значение, которое было false автоматически приводится к array, что теперь устарело и потенциально опасно
Решение: Нужно добавить проверку на массив перед проблемной строкой: if (is_array($var))
Unknown: Creation of dynamic property Request::$request is deprecated in /system/library/request.php on line 26
Unknown: Creation of dynamic property Session\DB::$db is deprecated in/system/library/session/db.php on line 8
Unknown: Creation of dynamic property Proxy::$getTranslations is deprecated in /system/engine/proxy.php on line 30
Unknown: Creation of dynamic property Cart\Cart::$config is deprecated in /system/library/cart/cart.php on line 7
Причина: в PHP 8.2+ нельзя создавать свойства объектов «на лету».
Решение: Объявите свойство в классе заранее, в начале php класса, например:
private $request;
private $db;
private $proxy;
private $cart;