Многие разработчики откладывают обновление PHP с версии 5 до 8, как визит к стоматологу. Но на самом деле это не так страшно, если знать правильный маршрут. В этой статье я расскажу, как переехать без лишних нервов, с примерами кода и практическими советами.

Почему стоит переезжать прямо сейчас

PHP 5 умер официально еще в 2018 году. Без обновлений безопасности ваш сайт — как дом с открытой дверью. PHP 8 работает в два-три раза быстрее, добавляет строгую типизацию, атрибуты и кучу вкусностей. Например, JIT-компиляция ускоряет тяжелые вычисления. Если вы все еще на PHP 5, вы теряете деньги на хостинге и рискуете данными пользователей.

Переход на PHP 8 — это не просто смена цифры в настройках. Это изменение привычек. Но я обещаю: после переезда вы не захотите возвращаться.

Шаг 1: Проверьте совместимость вашего кода

Первое, что нужно сделать — просканировать проект на устаревшие функции. В PHP 5 были популярны mysql_* функции, которые удалены в PHP 7 и выше. Также исчезли ereg, split и старый способ объявления конструкторов.

Вот список того, что сломается в PHP 8:

  • Функции mysql_connect, mysql_query и подобные — используйте PDO или mysqli.
  • Старый синтаксис конструкторов с именем класса — замените на __construct.
  • Функции each, ereg, split — используйте foreach и preg_match.
  • Передача нескалярных значений по умолчанию в функции — теперь только скаляры.

Для поиска проблем используйте инструмент PHPCompatibility через PHP CodeSniffer. Он покажет все места, которые нужно переписать.

Правило: Не пытайтесь обновить все за один день. Разбейте проект на модули и тестируйте каждый отдельно.

Шаг 2: Обновите зависимости и библиотеки

Если вы используете фреймворки (Laravel, Symfony, CodeIgniter), проверьте их совместимость с PHP 8. Например, Laravel 5.x не дружит с PHP 8 — нужен Laravel 6 или новее. Для Symfony требуется версия 4.4 или 5.x.

Сделайте список всех библиотек из composer.json и проверьте их на Packagist. Если какая-то библиотека не обновляется, ищите альтернативу. Не держитесь за старье.

Вот таблица популярных фреймворков и минимальных версий для PHP 8:

ФреймворкМинимальная версия для PHP 8
Laravel6.x
Symfony4.4
CodeIgniter4.x
Yii2.0.40
Zend Framework3.0

Шаг 3: Настройте строгую типизацию

PHP 8 любит, когда все по правилам. Добавьте declare(strict_types=1); в начало каждого файла. Это заставит PHP строго проверять типы аргументов и возвращаемых значений. Например, если функция ожидает int, а вы передаете строку — будет ошибка.

Вот пример, как это выглядит:

<?php
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

echo add(5, 10); // 15
echo add('5', 10); // Fatal error

Сначала это кажется муторным, но зато вы избавитесь от половины багов. Ваш код станет предсказуемым.

Шаг 4: Замените устаревшие конструкции

В PHP 5 было много магии, которая исчезла. Например, __autoload заменен на spl_autoload_register. Метод __toString теперь должен возвращать строку, иначе ошибка. Также убрали each() и magic quotes.

Вот пример замены each на foreach:

// PHP 5 (устарело)
$array = ['a' => 1, 'b' => 2];
while (list($key, $value) = each($array)) {
    echo "$key: $value\n";
}

// PHP 8
$array = ['a' => 1, 'b' => 2];
foreach ($array as $key => $value) {
    echo "$key: $value\n";
}

Также обратите внимание на call_user_func — его лучше заменить на синтаксис с переменными функциями.

Лайфхак: Используйте инструмент Rector для автоматического рефакторинга. Он сам перепишет код под PHP 8. Но после него обязательно проверьте результат вручную.

Шаг 5: Протестируйте все на локальном сервере

Никогда не обновляйте PHP на боевом сервере без тестов. Поднимите локальную среду с PHP 8 (например, через Docker или XAMPP). Скопируйте проект, запустите юнит-тесты. Если их нет — напишите хотя бы базовые сценарии.

Проверьте все формы, AJAX-запросы и интеграции с внешними сервисами. Особенно внимательно смотрите на работу с датами и строками — в PHP 8 изменилось поведение некоторых функций.

Вот пример типичной ошибки с strpos:

// PHP 5 (могло работать)
if (strpos('hello', 'h')) { // true
    echo 'Найдено';
}

// PHP 8 (строго)
if (strpos('hello', 'h') !== false) {
    echo 'Найдено';
}

Из-за того, что strpos возвращает 0, а 0 считается false, старый код мог пропустить ошибку.

Что в итоге

Переход с PHP 5 на PHP 8 — это как переезд в новую квартиру. Сначала хлопотно, но потом вы радуетесь скорости и удобству. Главное — не спешить, тестировать каждый шаг и использовать автоматические инструменты. Помните: безопасность и производительность стоят затраченного времени.

Если вы все сделаете правильно, ваш проект будет работать быстрее, а вы получите доступ к новым возможностям, таким как named arguments, match expression и атрибуты. Удачи в переезде!

Студия WNDER