🚀 Переезд сайта с PHP 5.3/5.4 на PHP 8.4. Полный чек-лист проверки
Переход с PHP 5.3-5.4 на PHP 8.4 - это не просто обновление версии. Это скачок через 10+ лет изменений языка. И если подойти системно, то можно получить прирост скорости, безопасности и стабильности. А не просто гору ошибок на сайте и головную боль.
Ниже я при (помощи нейронки) собрал практический чек-лист из того, что сам проверял после обновления сайта. И из того, что вам рекомендую проверить. Особенно, если это старый самописный проект.

Иллюстрация от Grok.
1) Включить максимальный вывод ошибок
В PHP 8.4 многие старые предупреждения стали фатальными ошибками. И без включенного E_ALL вы просто не увидите половину проблем.
error_reporting(E_ALL);
ini_set('display_errors', 1);
2) Удалённые функции (это ломает сайт сразу)
❌ ereg / eregi / eregi_replace
Удалены ещё в PHP 7.
Было:
eregi_replace("test", "demo", $text);
Стало:
preg_replace("/test/i", "demo", $text);
❌ mysql_* функции
Полностью удалены.
Было:
mysql_query("SELECT * FROM users");
Нужно заменить на:
mysqli или PDO (лучший вариант)
Пример mysqli:
$mysqli = new mysqli($host, $user, $pass, $db);
$result = $mysqli->query("SELECT * FROM users");
❌ each()
Удалена.
Было:
while (list($key, $value) = each($array)) {
Стало:
foreach ($array as $key => $value) {
❌ create_function()
Удалена.
Было:
$func = create_function('$a', 'return $a*2;');
Стало:
$func = function($a) { return $a * 2; };
3) Строгие типы и сравнения
PHP 8 стал намного строже.
Разница между == и ===
0 == "0" // true
0 === "0" // false
Если раньше код полагался на нестрогие сравнения - возможны неожиданные баги.
Рекомендация:
• использовать ===
• избегать неявного приведения типов
4) Работа с переменными: ?? ''
В старых версиях часто писали так:
$login = $_POST['login'];
В PHP 8 это может вызвать warning:
Undefined array key "login"
Правильный вариант:
$login = $_POST['login'] ?? '';
Или:
login = isset($_POST['login']) ? $_POST['login'] : '';
Оператор ?? - безопасный способ работы с массивами.
5) count() и null
Раньше работало:
count(null);
Теперь это Fatal error.
Правильно:
if (is_array($data) && count($data) > 0)
или
count($data ?? [])
6) implode() порядок аргументов
Раньше работало:
implode($array, ",");
Теперь порядок строго:
implode(",", $array);
7) mktime() без аргументов
В PHP 5 работало:
mktime();
Теперь вызывает ошибку.
Замена:
time();
8) htmlspecialchars и строгие режимы
Рекомендуемый современный вариант:
htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
Без указания кодировки можно получить warning.
9) Работа с куками и сессиями
Проверить:
• Используется ли session_register() (удалена)
• Нет ли обращения к $_COOKIE без isset()
• Не пишутся ли заголовки после вывода
10) Проверка админки - что тестировать
Обязательно пройти руками:
✔ Авторизация (логин, выход, восстановление пароля)
✔ CRUD (создание записи, редактирование, удаление, загрузка файлов)
✔ Формы (POST и GET параметры, работа с чекбоксами, загрузка изображений)
✔ Сортировки и фильтры.
PHP 8 стал строже к callback-функциям и сортировкам.
Пример возможной ошибки: Uncaught TypeError: Cannot read properties of null.
11) preg_replace с /e
Если вдруг где-то используется:
preg_replace('/pattern/e', 'code', $text);
Флаг /e удалён. Нужно переписывать на preg_replace_callback.
12) Динамические свойства (ВАЖНО для старых CMS)
В PHP 8.2+:
$obj->newProperty = 1;
Вызывает предупреждение, если свойство не объявлено.
Решения:
Объявить свойства в классе.
Добавить атрибут:
#[AllowDynamicProperties]
class MyClass {}
13) Работа с ошибками файлов
Проверить:
• fopen()
• file_get_contents()
• запись в лог-файлы
• права на директории
• PHP 8 строже реагирует на ошибки записи.
14) JSON
Включить флаг для проверки ошибок:
json_decode($json, true, 512, JSON_THROW_ON_ERROR);
В старых проектах часто не проверяется json_last_error().
15) Производительность после миграции
После перехода вы получите:
• +30–60% к скорости
• меньше потребления памяти
• более безопасную обработку данных
• Но только если код не завален legacy-конструкциями.
🔎 Финальный чек-лист перед продакшеном
☑ Убраны mysql_*
☑ Убраны ereg_*
☑ Нет create_function
☑ Нет each()
☑ Нет обращения к массивам без ??
☑ Нет count(null)
☑ Проверены сортировки
☑ Проверена админка полностью
☑ Включен E_ALL
☑ Проверены права на файлы
💡 Совет
Не обновляйте PHP сразу на боевом сервере.
Сделайте:
1) Локальную копию
2) Тестовый поддомен
3) Включите логирование ошибок
4) Пройдитесь по всему функционалу
Итог
Переход с PHP 5.3 на 8.4 - это не "обновление версии". Это почти рефакторинг проекта.
Но если всё сделать правильно, вы получите:
• современный и безопасный код
• стабильную работу
• совместимость с новыми библиотеками
• готовность к будущим версиям PHP



