Cover Image for Что нового в PHP 8.5: практические улучшения для повседневной разработки

Что нового в PHP 8.5: практические улучшения для повседневной разработки

18 ноября 2025

PHP 8.5 ожидается 20 ноября 2025 года и приносит набор улучшений, которые ощущаются в ежедневной разработке: конвейерный оператор |> для линейных преобразований, финальная промоция свойств для неизменяемых объектов, усиление диагностики конфигурации и новые возможности интернационализации. Ниже — краткий обзор и примеры применения в проектах, включая WordPress и WooCommerce.

TL;DR

  • Чище и короче цепочки вызовов с конвейерным оператором |>
  • Неизменяемые модели через финальную промоцию свойств
  • Быстрая проверка нетиповых настроек: php —ini=diff
  • Атрибут #[NoDiscard] заставляет использовать важные возвращаемые значения
  • Константы с анонимными функциями и callable-ссылками
  • PHP_BUILD_DATE для отслеживания времени сборки
  • array_first()/array_last() для явного доступа к краям массива
  • IntlListFormatter и помощники направления письма для i18n
  • Инспекция текущих обработчиков ошибок/исключений

1) Конвейерный оператор (|>)

Главная идея — проталкивать значение через последовательность преобразований без временных переменных и вложенных вызовов. Это делает код линейным и читабельным.

$result = '   jane.doe@example.com  '
    |> trim(...)
    |> strtolower(...)
    |> ucfirst(...);
// Результат: "Jane.doe@example.com"

В контексте WordPress это упрощает обработку данных из форм, метаполей и REST-запросов:

$username = get_post_meta($post_id, 'username', true)
    |> trim(...)
    |> sanitize_user(...);

Вместо глубоко вложенных вызовов получаем явную «линию обработки», которую проще ревьюить и поддерживать.

2) Финальное продвижение свойств класса

Теперь конструкторные свойства можно объявлять final, закрепляя неизменяемость после инициализации. Это повышает надёжность Value Object и DTO.

class ApiRequest {
    public function __construct(
        final string $endpoint,
        final array $payload
    ) {}
}

Для WooCommerce удобно фиксировать валюту, идентификатор корзины или способ оплаты в объекте-команде, исключая последующие случайные изменения. Повышается предсказуемость логики и корректность кэша.

3) Диагностика конфигурации: php —ini=diff

Новая опция CLI показывает только те INI-директивы, которые отличаются от дефолта:

$ php --ini=diff
; Только изменённые параметры
memory_limit = "1G"
upload_max_filesize = "100M"

Это экономит время при поиске причин расхождений между окружениями (dev/stage/prod), особенно когда поведение плагинов зависит от ограничений памяти, размера загрузок или расширений.

4) Принудительное использование результата: #[NoDiscard]

Критичные к контролю ошибок методы можно пометить атрибутом так, чтобы возвращаемое значение нельзя было игнорировать.

#[NoDiscard("Must check status code")]
function createTransaction(): TransactionResult {
    // ...
}

createTransaction(); // Предупреждение: результат необходимо обработать

Атрибут дисциплинирует обработку статусов, валидации и ошибок API — полезно в оплатах, интеграциях и миграциях данных.

5) Константы: замыкания и callable

Теперь константе можно присвоить анонимную функцию или ссылку на вызываемую сущность.

class Formatter {
    public const TO_UPPER = fn(string $v): string => strtoupper($v);
    public const LOG = self::class . '::log';
}

$val = Formatter::TO_UPPER('wp_user'); // "WP_USER"

Это облегчает организацию реиспользуемых стратегий без глобальных функций и «магических строк», а также делает конфигурацию поведения явной и статически проверяемой.

6) Константа PHP_BUILD_DATE

Встроенная константа с отметкой времени сборки интерпретатора помогает в операционке и отладке.

echo 'Compiled on: ' . date('Y-m-d H:i:s', PHP_BUILD_DATE);

Вhealth-check страницы админки можно вывести дату сборки, чтобы быстрее выявлять «дрейф» окружений и несинхронизированные контейнеры.

7) array_first() и array_last()

Прямой доступ к первому и последнему элементу массива без изменения внутреннего указателя:

$statuses = ['draft', 'review', 'publish'];
array_first($statuses); // 'draft'
array_last($statuses);  // 'publish'

Полезно для выбора крайних значений диапазона, последнего статуса, финального шага онбординга и т.п. Код становится намеренно-говорящим.

8) IntlListFormatter: локализованные списки

Класс упрощает корректное форматирование списков с учётом правил языка.

$fmt = new IntlListFormatter('en', IntlListFormatter::TYPE_AND);
echo $fmt->format(['one', 'two', 'three']); // "one, two, and three"

В мультиязычных магазинах так проще формировать перечисления атрибутов товара, способов доставки или правил промоакций без ручного учёта союзов и пунктуации разных языков.

9) Помощники направления письма (RTL)

Определение правостороннего письма стало проще:

if (locale_is_right_to_left('he')) {
    // Подстроить выравнивание/иконки для RTL
}

Это дополняет RTL-поддержку ядра WordPress при генерации HTML на PHP-стороне (например, в почтовых шаблонах, серверном рендеринге блоков, PDF-счетах).

10) Получение активных обработчиков ошибок/исключений

Можно безопасно обернуть существующие обработчики, не ломая цепочку:

$prev = get_exception_handler();
set_exception_handler(function ($e) use ($prev) {
    // собственный лог
    error_log($e->getMessage());
    // делегирование предыдущему
    $prev && $prev($e);
});

В проде это даёт тонкий контроль над телеметрией и деградацией, сохраняя совместимость с хостингом и плагинами.

Бонус

  • curl_multi_get_handles(): удобный доступ ко всем дескрипторам мульти-сессии — полезно для массовых запросов к API доставки/оплат.
  • Улучшенные трассировки для фатальных ошибок: быстрее диагностировать глубоко вложенные проблемы.
  • Атрибуты для констант и асимметричная видимость: точнее настраивают инкапсуляцию и контрактность API.

Практика обновления и совместимость

  • Минимизируйте риск: включите тесты, статику и встроенные deprecation-репорты перед апдейтом окружения.
  • Проверьте зависимости: темы/плагины, расширения (особенно intl), настройки opcache и JIT.
  • В Composer зафиксируйте platform.php и постепенно снимайте пины после прогонов CI.
  • Протестируйте критические пути WooCommerce: чекаут, вебхуки, оплаты, генерация документов и импорты.

Итог

PHP 8.5 — релиз про удобство и надёжность. Конвейерный оператор и финальная промоция свойств делают код чище, #[NoDiscard] дисциплинирует контроль результатов, php —ini=diff ускоряет диагностику, а i18n-улучшения улучшают UX глобальных продуктов. Для команд, поддерживающих WordPress и WooCommerce, это означает меньше «клей-кода», больше предсказуемости и быстрее находящиеся проблемы на проде.