# PHP 8.3 и 8.4 на сервере: что нового и когда обновляться

> PHP 8.3 и 8.4: главные изменения, сроки поддержки версий и порядок обновления на сервере без простоя сайта.

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 на проде](https://www.zevshost.net/ru/kb/php-strict-types-tipizaciya/).

## Как работают 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 на одном сервере](https://www.zevshost.net/ru/kb/php-multi-version-linux/). Список нужных расширений для конкретного фреймворка проще собрать по инструкции [про установку расширений PHP](https://www.zevshost.net/ru/kb/php-extensions-ubuntu-debian/).

## Стоит ли обновляться: чек-лист

Обновление версии PHP — это не разовая кнопка, а проверка совместимости. Порядок действий такой:

1. Разверните копию проекта на staging с новой версией PHP и прогоните тесты или хотя бы основные сценарии вручную.
2. Выполните `composer install` и убедитесь, что все зависимости поддерживают выбранную версию без предупреждений о совместимости.
3. Переключите PHP-FPM на новую версию и включите JIT в OPcache — прирост скорости на CPU-интенсивных задачах заметен уже на первых запросах.

## Частые вопросы

### Как обновиться с PHP 8.3 до PHP 8.4 без остановки сайта во время перехода?

Новую версию стоит ставить рядом со старой, не удаляя её сразу, и сначала проверить проект на копии на staging. После команды composer install нужно убедиться, что все зависимости поддерживают новую версию без предупреждений, и только затем переключить пул PHP-FPM на PHP 8.4 — тогда в случае проблем можно мгновенно вернуться на прежнюю версию.

### Какие изменения при переходе с PHP 8.3 на PHP 8.4 чаще всего ломают старый код?

Главный кандидат — неявные nullable-типы в сигнатурах функций: в PHP 8.4 такая запись считается устаревшей и требует явного знака вопроса перед типом. Также стоит заранее проверить расширения из pecl, которые давно не обновлялись, динамические свойства классов без специального атрибута и библиотеки Composer с жёстко прописанной верхней границей поддерживаемой версии PHP.

### Можно ли продолжать работать на PHP 8.1, пока руки не дойдут до полноценного обновления?

Формально сайт продолжит работать без видимых изменений: активная поддержка PHP 8.1 уже завершена, а фаза одних только security-патчей подходит к концу. Это означает, что новые уязвимости в этой версии перестанут закрываться совсем, и сервер постепенно окажется без защиты от свежих проблем — повод скорее спланировать переход, чем откладывать его дальше.

### Обязательно ли сразу включать JIT в OPcache при переходе на новую версию PHP?

Нет, это не обязательный шаг для работы на новой версии, а отдельная рекомендация из чек-листа по итогам обновления. Большинство обычных сайтов упираются в скорость базы данных или сети, а не в вычисления процессора, поэтому прирост от JIT там малозаметен. Включать его стоит отдельно для CPU-интенсивных задач, где выигрыш в скорости виден уже на первых запросах.

---

Источник: https://www.zevshost.net/ru/kb/php-84-novye-vozmozhnosti/
