Ссылки Поиск Написать В избранное NO

🚀 Переезд сайта с PHP 5.3/5.4 на PHP 8.4. Полный чек-лист проверки

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


Ниже я при (помощи нейронки) собрал практический чек-лист из того, что сам проверял после обновления сайта. И из того, что вам рекомендую проверить. Особенно, если это старый самописный проект.


(12.02.2026 blogger) Переезд сайта с PHP 5.3/5.4 на PHP 8.4 - Полный чек-лист проверки
Иллюстрация от 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