Почему читать про PHP 8.5 именно сейчас
31 декабря 2026 года, через полтора месяца, у ветки 8.2 заканчивается любая поддержка, а у ветки 8.4 — активная: останутся только исправления безопасности, до 31 декабря 2028 года. Если сайт работает на 8.2, вопрос не в том, переходить ли, а в том, на что. Сроки взяты со страницы php.net/supported-versions.
| Ветка | Выпуск | Активная поддержка до | Исправления безопасности до |
|---|---|---|---|
| 8.2 | 8 декабря 2022 | 31 декабря 2024 | 31 декабря 2026 |
| 8.3 | 23 ноября 2023 | 31 декабря 2025 | 31 декабря 2027 |
| 8.4 | 21 ноября 2024 | 31 декабря 2026 | 31 декабря 2028 |
| 8.5 | 20 ноября 2025 | 31 декабря 2027 | 31 декабря 2029 |
Для нового проекта берите 8.5: безопасность у неё до 31 декабря 2029 года. Ветка 8.3 доживает до 31 декабря 2027 года и подходит как промежуточная, если зависимости ещё не готовы к 8.5. Ветка 8.1 с 31 декабря 2025 года не поддерживается вовсе (php.net/eol.php). Актуальный патч 8.5 по журналу изменений php.net — 8.5.12 от 22 октября 2026 года (на начало ноября 2026 года); сверьте номер перед обновлением.
Что нового в PHP 8.5
PHP 8.5 вышел 20 ноября 2025 года. Главное в нём — оператор конвейера, атрибут NoDiscard, клонирование с изменением свойств и два давно ожидаемых помощника для массивов. Всё перечисленное ниже подтверждено файлом UPGRADING ветки PHP-8.5 и релизной страницей php.net.
- оператор конвейера
|>; - атрибут
#[\NoDiscard]и приведение(void); - замыкания и first-class callable в константных выражениях;
cloneс параметром (clone with);- расширение URI, которое теперь всегда включено;
array_first()иarray_last();- постоянные cURL share-handles;
- трассировка стека при фатальных ошибках;
get_error_handler()иget_exception_handler();- OPcache, который теперь всегда встроен.
Оператор конвейера
Оператор |> передаёт результат левой части в вызываемое справа, поэтому цепочку преобразований читаешь слева направо, а не изнутри наружу. Справа стоит вызываемое с одним аргументом: функция, метод или first-class callable. Стрелочную функцию берите в скобки.
$slug = " Hello PHP 8.5 "
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(" ", "-", $s));
echo $slug; // hello-php-8.5Без конвейера то же записывалось бы вложенными вызовами: str_replace(" ", "-", strtolower(trim($s))). Читать такую запись приходится с конца.
NoDiscard, clone with и array_first()
Три небольших нововведения, которые заметнее всего в повседневном коде. Атрибут #[\NoDiscard] заставляет PHP предупреждать, если результат вызова проигнорирован, а приведение (void) явно говорит «результат не нужен». clone принимает массив свойств, а array_first() и array_last() заменяют обходные приёмы вроде reset() и end().
#[\NoDiscard]
function saveOrder(array $data): bool { return true; }
saveOrder($data); // предупреждение: результат проигнорирован
(void) saveOrder($data); // явно: результат не нужен
$moved = clone($address, ["city" => "Kyiv"]);
$first = array_first([10, 20, 30]); // 10
$last = array_last([10, 20, 30]); // 30Для пустого массива array_first() вернёт null. Предыдущую версию разбирает статья про PHP 8.4, а о строгой типизации, которая хорошо сочетается с NoDiscard, написано в статье про strict_types.
Расширения и среда: URI, cURL, OPcache
Часть новинок касается не языка, а окружения, и для хостинга она важнее синтаксиса. Расширение URI всегда включено и даёт классы Uri\Rfc3986\Uri и Uri\WhatWg\Url для разбора адресов по стандартам. Постоянные cURL share-handles создаёт функция curl_share_init_persistent(). Трассировку при фатальных ошибках включает параметр fatal_error_backtraces. OPcache теперь встроен в PHP всегда.
Что реально ломает рабочий код
Код ломают не устаревшие возможности, а раздел несовместимых изменений в UPGRADING: устаревшие (deprecated) лишь выдают предупреждения E_DEPRECATED. Для хостинга важны пункты ниже; проверьте их до смены версии, а не после ошибки в журнале.
- удалена INI-директива
disable_classes: уберите её из php.ini и из пулов FPM; - строка
zend_extension=opcacheтеперь даёт предупреждение, потому что OPcache встроен; - изменены значения констант
PDO::FETCH_GROUP,PDO::FETCH_UNIQUE,PDO::FETCH_CLASSTYPE,PDO::FETCH_PROPS_LATEиPDO::FETCH_SERIALIZE: числа вместо констант в коде придётся заменить; - расширение intl требует ICU 57.1 или новее;
- ключ
$_SESSIONс символом|даёт предупреждение; - приведение NAN и значений float вне диапазона к int даёт предупреждение.
Список не исчерпывающий: пройдите раздел несовместимых изменений в UPGRADING целиком.
Устаревшее: что встречается в старом коде
Устаревшие возможности продолжают работать, но дают E_DEPRECATED и позже могут быть удалены. В старом коде чаще всего попадаются четыре: приведения (boolean), (integer) и (double), обратные кавычки вместо shell_exec(), функция curl_close() и null в роли ключа массива. Список взят из раздела Deprecated Functionality в UPGRADING.
| Устарело | Чем заменить |
|---|---|
(boolean), (integer), (double) | (bool), (int), (float) |
| обратные кавычки | shell_exec() |
curl_close() | убрать вызов, дескриптор освобождается сам |
null как ключ массива | явный ключ, например пустая строка |
Когда и как переходить
Переходите на 8.5, когда зависимости проекта заявляют его поддержку; если вы на 8.2, сделайте это до конца декабря. Не меняйте версию у боевого сайта «на месте»: поставьте вторую версию рядом, прогоните тесты и переключите пул.
- На копии сайта включите вывод всех ошибок и соберите журнал на текущей версии.
- Поставьте 8.5 рядом с рабочей версией, как описано в статье про несколько версий PHP на одном сервере.
- Пройдите список несовместимых изменений и найдите их в конфигах и коде.
- Обновите зависимости Composer и прогоните тесты на 8.5.
- Переключите один пул FPM или один сайт и понаблюдайте за журналом.
- Оставьте прежнюю версию установленной на время, достаточное для отката.
php -v
grep -rn "disable_classes" /etc/php/
grep -rn "zend_extension" /etc/php/
grep -rnE "\((boolean|integer|double)\)" --include=*.php .
grep -rn "curl_close" --include=*.php .Как получать исправления безопасности для установленной ветки, написано в статье про обновление PHP на Ubuntu и Debian.
Частые вопросы
Нужно ли уходить с PHP 8.2 до конца года?
Да. 31 декабря 2026 года у ветки 8.2 кончается поддержка, включая исправления безопасности. После этой даты уязвимости в ней закрываться не будут.
Подойдёт ли PHP 8.4, если 8.5 пока рано?
Подойдёт на время: активная поддержка 8.4 кончается 31 декабря 2026 года, а исправления безопасности выходят до 31 декабря 2028 года. Для нового проекта разумнее сразу 8.5.
Устаревшие функции сломают мой сайт?
Нет, они лишь выдают предупреждения. Ломают код пункты из раздела несовместимых изменений: удалённая директива, изменённые константы, требования к ICU.
Что делать клиентам ZevsHost?
На общем хостинге версию PHP переключает панель, и обновлять сервер не нужно: выберите версию для сайта и проверьте журнал. На VPS и выделенном сервере версию и обновления выбираете вы сами.