← Всі статті
24 червня 2026 р.

Застарілі функції PHP 8: що зламалося та як це виправити

PHP 8.0 (випущено 2020) та PHP 8.1/8.2 зробили мову більш суворою. Функції, які були «застарілими» (deprecated) у PHP 7.x (тобто ще працювали, але з попередженням), у PHP 8 стали фатальними помилками.

Чому PHP 8 ламає старий код

PHP 8.0 (випущено 2020) та PHP 8.1/8.2 зробили мову більш суворою. Функції, які були «застарілими» (deprecated) у PHP 7.x (тобто ще працювали, але з попередженням), у PHP 8 стали фатальними помилками.

Якщо ваш сайт зламався після оновлення сервера, майже напевно причина в одному з цих пунктів.

Найпоширеніші проблеми

1. Функції mysql_* (видалено в PHP 7, фатальна помилка в PHP 8)

// НЕ ПРАЦЮЄ — повністю видалено
$conn = mysql_connect("localhost", "user", "pass");
$result = mysql_query("SELECT * FROM products");

// ВИПРАВЛЕНО — використовуйте mysqli або PDO
$conn = new mysqli("localhost", "user", "pass", "dbname");
$result = $conn->query("SELECT * FROM products");

Якщо ви досі використовуєте mysql_*, вашому коду щонайменше 10 років. Переписування просте, але трудомістке для великих кодових баз.

2. ereg() та ereg_replace() (видалено в PHP 7)

// НЕ ПРАЦЮЄ
if (ereg("^[a-z]+$", $str)) { ... }
$clean = ereg_replace("[^a-z0-9]", "", $str);

// ВИПРАВЛЕНО — використовуйте еквіваленти preg_
if (preg_match("/^[a-z]+$/", $str)) { ... }
$clean = preg_replace("/[^a-z0-9]/", "", $str);

3. create_function() (видалено в PHP 8.0)

// НЕ ПРАЦЮЄ
$fn = create_function('$x', 'return $x * 2;');

// ВИПРАВЛЕНО — використовуйте анонімну функцію
$fn = function($x) { return $x * 2; };
// або стрілкову функцію
$fn = fn($x) => $x * 2;

4. each() (видалено в PHP 8.0)

// НЕ ПРАЦЮЄ
while (list($key, $val) = each($array)) { ... }

// ВИПРАВЛЕНО
foreach ($array as $key => $val) { ... }

5. Глобальні змінні $HTTP_*_VARS (давно зникли, але ще є в старому коді)

// НЕ ПРАЦЮЄ — ці змінні відсутні з PHP 5.4
$id = $HTTP_GET_VARS['id'];
$name = $HTTP_POST_VARS['name'];

// ВИПРАВЛЕНО
$id = $_GET['id'];
$name = $_POST['name'];

6. Передача null у параметри, що не допускають null (PHP 8.1)

Це підступна проблема, яка ламає чимало сучаснішого коду:

// НЕ ПРАЦЮЄ в PHP 8.1 — strlen не приймає null
$len = strlen(null);  // Фатальна помилка: strlen(): Argument #1 must be of type string, null given

// ВИПРАВЛЕНО
$len = strlen($value ?? '');
// або
$len = $value !== null ? strlen($value) : 0;

Це виникає, коли змінні, які можуть бути null, передаються у функції, що очікують рядок або ціле число. Часто зустрічається з результатами бази даних, де стовпець може бути NULL.

7. Арифметичні операції над рядками (PHP 8.0)

// Раніше працювало, тепер TypeError у PHP 8
$total = "10" + "20abc";  // Раніше: 30, тепер: TypeError

// ВИПРАВЛЕНО — явне приведення типів
$total = (int)"10" + (int)"20abc";  // 30

8. ReflectionParameter::getClass() (PHP 8.0)

Код фреймворків часто використовує рефлексію. Цей метод було видалено:

// НЕ ПРАЦЮЄ
$class = $param->getClass();

// ВИПРАВЛЕНО
$type = $param->getType();
if ($type instanceof ReflectionNamedType && !$type->isBuiltin()) {
    $class = new ReflectionClass($type->getName());
}

Як знайти всі проблеми одразу

Варіант 1: Перевірка сумісності з PHP

Встановіть php-compatibility за допомогою PHPCS:

composer global require squizlabs/php_codesniffer
composer global require phpcompatibility/php-compatibility
phpcs --standard=PHPCompatibility --runtime-set testVersion 8.0 /path/to/your/code

Це просканує всю вашу кодову базу і перелічить усі проблеми сумісності з файлами та рядками.

Варіант 2: Увімкніть логування помилок спочатку

Якщо ви не можете запустити статичний аналізатор, хоча б увімкніть логування помилок:

// У php.ini або .htaccess
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php_errors.log
display_errors = Off  // Не показувати помилки користувачам

Потім запустіть кожну сторінку та перевірте логи. Ви побачите, які саме функції викликають помилки.

Варіант 3: Протестуйте на PHP 8 перед міграцією

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

Специфічні проблеми OpenCart з PHP 8

Якщо ваш сайт працює на OpenCart 2.x або ранній 3.x, ось як виправити найпоширеніші проблеми:

  1. Оновіть ядро OpenCart
    Зайдіть в адмін-панель, перейдіть у меню System → Settings. У вкладці General подивіться версію. Якщо вона нижче 3.0.3.8, скачайте останній патч з офіційного сайту OpenCart та встановіть через Extensions → Installer. Це виправить більшість проблем сумісності з PHP 8.

  2. Перевірте розширення
    Вимкніть усі сторонні модулі (Extensions → Modules) по одному та перевірте, чи зникає помилка. Модулі, написані під старі версії PHP, часто використовують застарілі функції. Для кожного проблемного модуля зверніться до його розробника за оновленням або замініть на сучасний аналог.

  3. Оновіть модулі оплати
    У розділі Extensions → Payments переконайтесь, що всі модулі оплати сумісні з PHP 8. Якщо ні — оновіть їх або зверніться до розробника.

  4. Налаштуйте логування помилок
    Увімкніть логування в адмінці: System → Settings → Server — увімкніть "Log Errors" та переглядайте лог через System → Error Logs. Це допоможе виявити, які саме функції викликають помилки.

Якщо ви спробували кроки вище і все ще не вийшло (або не хочете робити це самі) — ми можемо допомогти з міграцією вашого сайту на PHP 8.

Потрібна допомога з цим?

DevCev Digital спеціалізується саме на таких задачах. Розкажіть що потрібно — відповімо протягом кількох годин.

Безкоштовна діагностика →Виправлення PHP та legacy-код
← Назад до блогуЄ проєкт? Поговоримо →