
PHP 8.5 — очередное крупное обновление популярного серверного языка программирования. В новой версии появились новые возможности языка, функции для работы с массивами, современный API для URL, улучшенная диагностика ошибок, изменения в curl, OPcache и другие полезные улучшения.
PHP 8.5 вышел 20 ноября 2025 года. Релиз продолжает развитие PHP в сторону более современного, удобного и выразительного языка.
Наиболее интересные изменения PHP 8.5:
Одним из самых заметных нововведений PHP 8.5 стал оператор конвейера.Он позволяет последовательно передавать результат одной функции следующей функции.
Например, раньше цепочку преобразований можно было написать так:
$result = trim(
strtolower(
strtoupper("Hello World")
)
);
В PHP 8.5 тот же код можно записать более последовательно:
$result = "Hello World"
|> strtoupper(...)
|> strtolower(...)
|> trim(...);
Код читается слева направо: результат предыдущей операции передаётся следующей функции.
function cleanTitle(string $text): string
{
return ucfirst($text);
}
$title = " PHP 8.5 — Новые возможности ";
$title = $title
|> trim(...)
|> strtolower(...)
|> cleanTitle(...);
Оператор конвейера особенно полезен в коде, где данные проходят несколько последовательных этапов обработки.
В PHP 8.5 появились две небольшие, но очень удобные функции:
array_first() и array_last().
$users = [
'admin',
'editor',
'user'
];
echo array_first($users);
// admin
echo array_last($users);
// user
Функции работают и с ассоциативными массивами:
$users = [ 'administrator' => 10, 'editor' => 20, 'guest' => 30 ]; echo array_first($users); // 10 echo array_last($users); // 30
Раньше для получения первого элемента разработчики часто использовали reset(), array_key_first() или другие конструкции.Теперь код стал значительно проще.
$first = array_first($users);
$last = array_last($users);
Если массив пустой, обе функции возвращают null.
$items = [];
var_dump(array_first($items));
// NULL
var_dump(array_last($items));
// NULL
В PHP давно существует оператор clone(), который позволяет создать копию объекта. PHP 8.5 расширяет эту возможность функцией clone(), позволяющей сразу изменить свойства новой копии.
class User
{
public function __construct(
public string $name,
public string $role
) {}
}
$user = new User('Иван', 'user');
$admin = clone($user, [
'role' => 'admin'
]);
Исходный объект при этом остаётся неизменным:
echo $user->role;
// user
echo $admin->role;
// admin
Такая возможность может быть полезна при работе с конфигурациями,DTO, моделями и другими объектами, которые необходимо использовать как основу для создания новых вариантов.
PHP 8.5 получил новый атрибут #[\NoDiscard].Он позволяет обозначить функции, возвращаемое значение которых не следует случайно игнорировать.
#[\NoDiscard]
function createToken(): string
{
return bin2hex(random_bytes(16));
}
Такой механизм особенно интересен для библиотек и больших проектов,где важно контролировать использование возвращаемых значений.
Если разработчик действительно хочет проигнорировать возвращаемое значение функции, это можно указать явно:
(void) createToken();
Такой код показывает другим разработчикам и инструментам анализа, что результат был проигнорирован намеренно.
Одним из важных изменений PHP 8.5 стал новый API для работы с URI и URL.
Работа с URL особенно важна для CMS, интернет-магазинов, API, роутеров, SEO-инструментов и систем редиректов.
URL состоит из нескольких компонентов:
Новый API ориентирован на современные стандарты обработки URI и позволяет создавать более структурированный код вместо ручной обработки URL как обычных строк.
В PHP 8.5 улучшена диагностика некоторых фатальных ошибок.В частности, разработчик может получить более подробную информацию о стеке вызовов.
Это особенно полезно для крупных CMS и приложений, где ошибка может возникнуть внутри нескольких уровней функций, подключаемых файлов или плагинов.
Чем подробнее stack trace, тем быстрее можно определить, где именно возникла проблема.
В PHP 8.5 появились функции:
get_error_handler();
get_exception_handler();
Они позволяют получить текущие пользовательские обработчики ошибок и исключений.
Например:
$oldHandler = get_error_handler();
set_error_handler(function (
int $severity,
string $message,
string $file,
int $line
) {
// Обработка ошибки
});
Такая возможность особенно полезна для библиотек и CMS, которые временно устанавливают собственные обработчики.
В PHP 8.5 появились новые возможности расширения curl.Среди них новые функции для работы с несколькими HTTP-соединениями и постоянными share handles.
Например, новая функция:
curl_multi_get_handles();
может быть полезна приложениям, которые одновременно выполняют большое количество HTTP-запросов.
Для CMS это актуально при работе с API новостей, погодой, переводчиками, Telegram, платёжными системами и другими внешними сервисами.
PHP 8.5 позволяет использовать FILTER_THROW_ON_FAILURE при валидации данных через filter_var().
try {
$email = filter_var(
$_POST['email'],
FILTER_VALIDATE_EMAIL,
FILTER_THROW_ON_FAILURE
);
} catch (Throwable $e) {
echo 'Некорректный email';
}Такой подход удобен в проектах, где обработка ошибок построена вокруг исключений.
OPcache остаётся одним из ключевых компонентов производительности PHP. PHP 8.5 продолжает работу над оптимизацией движка и кеширования скомпилированного PHP-кода.
Однако не стоит ожидать, что простое обновление PHP автоматически ускорит любой сайт в несколько раз.
На производительность CMS также влияют:
PHP 8.5 продолжает улучшать поддержку интернационализации. В расширении Intl появились новые возможности форматирования локализованных списков.
Это особенно полезно для мультиязычных сайтов и CMS, где один и тот же контент должен корректно отображаться на разных языках.
В PHP 8.5 появилась функция:
locale_is_right_to_left();
Она позволяет определить, использует ли конкретная локаль направление текста справа налево.
Это может пригодиться при создании мультиязычных CMS, поддерживающих арабский, иврит и другие RTL-языки.
PHP 8.5 получил поддержку partitioned cookies, связанных с современным механизмом CHIPS.
Это актуально для сайтов, использующих iframe, сторонние виджеты, внешние сервисы и другие сценарии, где cookie используются в стороннем контексте.
Атрибут #[\Override] помогает контролировать переопределение элементов классов при наследовании.
В PHP 8.5 его возможности были расширены, в том числе для свойств.
Это особенно полезно в крупных объектно-ориентированных приложениях и библиотеках.
При обновлении нельзя обращать внимание только на новые функции. В PHP 8.5 ряд старых конструкций получил статус deprecated.
Например:
mysqli_execute()
curl_close()
curl_share_close()
socket_set_timeout()
Старый код рекомендуется постепенно переводить на современные альтернативы.
Например:
mysqli_stmt_execute();
вместо устаревшего варианта mysqli_execute().
Если проект уже работает несколько лет, обновлять PHP сразу на рабочем сервере не рекомендуется.
composer outdated
composer check-platform-reqs
grep -R "mysqli_execute" .
grep -R "curl_close" .
grep -R "curl_share_close" .
Особое внимание необходимо уделить сторонним расширениям, старым библиотекам и самописным модулям.
Оптимальный вариант:
копия сайта
+
копия базы данных
+
PHP 8.5
+
тестирование
Для CMS вроде NGCMS переход на PHP 8.5 особенно интересен благодаря сочетанию новых возможностей языка и улучшенной диагностики ошибок.
Например, получение первого элемента массива теперь можно записать намного проще:
$first = array_first($items);
Для последовательной обработки данных можно использовать оператор конвейера:
$data
|> trim(...)
|> strtolower(...)
|> htmlspecialchars(...);
А при необходимости создания изменённой копии объекта:
$copy = clone($config, [
'debug' => true
]);
Улучшенная диагностика Fatal Error также может значительно упростить поиск проблем внутри движка CMS и плагинов.
| Возможность | Для чего нужна |
|---|---|
| Последовательная обработка данных |
| Получение первого элемента массива |
| Получение последнего элемента массива |
| Клонирование объекта с изменением свойств |
| Контроль использования возвращаемого значения |
| Явное игнорирование результата |
| URI API | Современная работа с URL |
| Fatal Error stack trace | Более удобная диагностика ошибок |
| Получение текущего обработчика ошибок |
| Получение текущего обработчика исключений |
| Валидация данных через исключения |
| Улучшенная интернационализация |
| Partitioned Cookies | Современная работа с cookie |
Для новых проектов PHP 8.5 является интересным выбором, если используемые библиотеки, CMS и расширения его поддерживают.
Для существующих проектов переход также имеет смысл, но делать его лучше постепенно.
Особенно внимательно необходимо проверять старые CMS, плагины, самописные библиотеки и проекты с большим количеством устаревшего кода.
Оптимальная схема обновления выглядит так:
PHP 8.5 — это не просто небольшое обновление с несколькими новыми функциями. Версия продолжает развитие языка и делает современный PHP более удобным для разработки крупных проектов.
Наиболее интересными нововведениями стали оператор конвейера |>, функции array_first() и array_last(), новый clone(), атрибут #[\NoDiscard], современный API для URL и улучшенная диагностика фатальных ошибок.
Для разработчиков CMS особенно важны новые возможности работы с массивами, URL, HTTP-запросами, ошибками, интернационализацией и cookie.
При этом переход на PHP 8.5 нельзя сводить к простой смене версии PHP на сервере. Перед обновлением необходимо проверить deprecated-функции, плагины, библиотеки, Composer-зависимости и конфигурацию сервера.
Если проект уже работает на PHP 8.3 или PHP 8.4 и находится в активной разработке, PHP 8.5 является логичным следующим шагом. Для старых проектов лучше сначала создать тестовую копию и только после успешного тестирования обновлять рабочий сервер.
PHP продолжает развиваться в сторону более выразительного, современного и удобного языка, а PHP 8.5 является ещё одним заметным шагом в этом направлении.