PHP 8.3 вышел в конце 2023 года, PHP 8.4 — годом позже. Обе версии уже доступны на большинстве серверов с cPanel и ISPmanager 6, но многие проекты до сих пор работают на PHP 8.1 просто по инерции. Разберём, что изменилось на практике и стоит ли переходить прямо сейчас.
Что нового в PHP 8.3 и PHP 8.4
PHP 8.3 добавил типизированные константы классов, атрибут
#[Override] для контроля переопределения методов и функцию
json_validate(), которая проверяет корректность JSON без
разбора всей структуры в память. Это заметно ускоряет валидацию входящих
запросов API.
PHP 8.4 пошёл дальше: появились property hooks (геттеры и сеттеры прямо
в объявлении свойства), асимметричная видимость (public readonly
можно сделать публичным на чтение и приватным на запись отдельно) и новые
функции для массивов — array_find(), array_any(),
array_all(). Подробнее о строгой типизации, которая хорошо
сочетается с этими нововведениями, — в статье
про strict_types на проде.
Как работают property hooks на практике
Раньше для валидации значения при записи в свойство нужен был отдельный метод-сеттер. Property hooks убирают эту прослойку:
class Product {
public int $price {
set {
if ($value < 0) {
throw new InvalidArgumentException('Цена не может быть отрицательной');
}
$this->price = $value;
}
}
}
Код становится короче, а IDE и статические анализаторы видят реальный тип свойства, а не догадываются по докблокам.
Сроки поддержки версий PHP
Каждая версия PHP получает два года активной поддержки с исправлением багов и ещё один год — только security-патчи. Дальше версия считается устаревшей и обновления прекращаются.
| Версия | Активная поддержка | Security-фиксы | Статус на сервере |
|---|---|---|---|
| PHP 8.1 | завершена | заканчивается | пора планировать переход |
| PHP 8.2 | завершается | идёт | ещё безопасно |
| PHP 8.3 | идёт | не началась | рекомендуется |
| PHP 8.4 | идёт | не началась | для новых проектов |
На что обратить внимание при переходе
Часть изменений в 8.3 и 8.4 ломает старый код, если он полагался на нестрогое поведение PHP. Перед обновлением проверьте:
- Неявные nullable-типы в сигнатурах функций — в PHP 8.4 такие объявления
считаются устаревшими и требуют явного
?type. - Динамические свойства классов без атрибута
#[AllowDynamicProperties]— они запрещены ещё с PHP 8.2. - Расширения из pecl, которые не обновлялись больше двух лет — часть из них ломается на новом Zend Engine.
- Библиотеки Composer с жёстко указанной верхней границей PHP в
composer.json— их придётся обновить или заменить.
Как проверить и переключить версию PHP на сервере
На Ubuntu и Debian версии PHP переключаются через update-alternatives,
а для сайтов под Nginx и PHP-FPM — через пул в конфиге виртуального хоста.
Сначала поставьте нужную версию рядом со старой, не удаляя её:
php -v
sudo apt install php8.4 php8.4-fpm php8.4-mysql php8.4-mbstring
sudo update-alternatives --set php /usr/bin/php8.4
sudo systemctl restart php8.4-fpm
Как держать несколько версий одновременно и переключать их per-vhost — описано в статье про несколько версий PHP на одном сервере. Список нужных расширений для конкретного фреймворка проще собрать по инструкции про установку расширений PHP.
Стоит ли обновляться: чек-лист
Обновление версии PHP — это не разовая кнопка, а проверка совместимости. Порядок действий такой:
- Разверните копию проекта на staging с новой версией PHP и прогоните тесты или хотя бы основные сценарии вручную.
- Выполните
composer installи убедитесь, что все зависимости поддерживают выбранную версию без предупреждений о совместимости. - Переключите PHP-FPM на новую версию и включите JIT в OPcache — прирост скорости на CPU-интенсивных задачах заметен уже на первых запросах.