13 августа 2026 года команда PHP выпустила PHP 8.6.0 Beta 1 — первую бета-версию будущего релиза. Дата выбрана не случайно: в тот же день закрылось «мягкое» окно для новых возможностей (soft feature freeze — момент, после которого все голосования по RFC должны быть завершены). Проще говоря, список того, что войдёт в PHP 8.6, с этого дня зафиксирован. Дальше будут только правки, тесты и стабилизация. Значит, уже сейчас можно посмотреть, каким получится язык, на котором работает большая часть сайтов рунета — от самописных проектов до WordPress и WooCommerce.
Главная новинка версии — частичное применение функций. Но кроме неё в 8.6 накопился внушительный список: новый класс для интервалов времени, API для опроса дескрипторов, более безопасные настройки сессий «из коробки», поддержка возобновления TLS-сессий и длинный список устаревших функций, о которых стоит узнать заранее.
Частичное применение функций: главная возможность PHP 8.6
Partial function application (PFA, «частичное применение функций») — приём, при котором из существующей функции создаётся новая, где часть аргументов уже подставлена заранее. В PHP 8.6 для этого используется знак вопроса на месте будущего аргумента:
$slugReplace = str_replace([' ', '_'], '-', ?);
$slugReplace('hello world'); // 'hello-world'
Раньше то же самое приходилось оборачивать в замыкание: fn(string $input) => str_replace([' ', '_'], '-', $input). Теперь лишний слой не нужен. Плейсхолдеров может быть несколько и на любых позициях, работает и с именованными аргументами, а отдельный вариадический плейсхолдер ... захватывает все оставшиеся параметры разом.
По-настоящему PFA раскрывается в паре с пайп-оператором |>, который появился в PHP 8.5 (релиз состоялся 20 ноября 2025 года). До 8.6 в цепочку нельзя было вставить функцию с несколькими аргументами, не написав вокруг неё замыкание. Теперь цепочка обработки читается сверху вниз почти как псевдокод:
$output = $input
|> trim(...)
|> str_replace(' ', '-', ?)
|> strtolower(...);
Сама реализация PFA попала в кодовую базу ещё в Alpha 3 (30 июля). Уже после этого разработчики приняли уточняющий RFC: все плейсхолдеры ? в получившемся замыкании становятся обязательными параметрами, даже если в исходной функции они были со значением по умолчанию. Логика простая: запись example(?, ?) визуально обещает два аргумента — пусть так и ведёт себя. Голосование прошло практически единогласно: 25 голосов «за», ни одного «против», один воздержавшийся. Побочный эффект приятный: статическим анализаторам вроде PHPStan и Psalm станет проще выводить типы.
Что ещё появилось в языке и стандартной библиотеке
Time\Duration и clamp()
В расширение date добавлен класс Time\Duration — представление промежутка времени с методами для арифметики и сравнения. Он попал как раз в Beta 1 и закрывает давнюю боль: таймауты и интервалы в PHP до сих пор передавались «голыми» числами, и по сигнатуре функции нельзя было понять, секунды это, миллисекунды или микросекунды.
Функция clamp() из Alpha 1 решает мелкую, но вездесущую задачу — загнать значение в границы:
clamp(101, min: 0, max: 100); // 100
Работает не только с числами, но и со строками, объектами DateTime и другими сравнимыми типами. Туда же — перечисление SortDirection с вариантами Ascending и Descending вместо самодельных констант в каждом проекте.
Полинг-API для асинхронных фреймворков
Набор классов Io\Poll\* даёт мультиплексирование ввода-вывода (одновременное отслеживание готовности множества сокетов и файлов) на платформенных механизмах — epoll в Linux, WSAPoll в Windows. Это не встроенная асинхронность в ядре языка: PHP по-прежнему не становится Node.js. Это фундамент для библиотек вроде ReactPHP и Amp, которые раньше собирали такую логику сами или тянули расширения ev/event.
Заодно переписан внутренний механизм копирования потоков: php_stream_copy_to_stream_ex() теперь использует системные примитивы sendfile, splice, copy_file_range и TransmitFile. Для отдачи файлов и проксирования это означает меньше копирований между буферами — выигрыш достаётся бесплатно, без правок в коде.
Рефлексия, атрибуты и мелочи для инструментов
Появился ReflectionParameter::getDocComment() — doc-комментарий теперь можно прикрепить прямо к параметру и прочитать в рантайме. Для фреймворков с контейнерами внедрения зависимостей и генераторов документации это заметное упрощение. Рядом — ReflectionProperty::isReadable() и ::isWritable(), которые наконец учитывают асимметричную видимость свойств.
Атрибут #[\Override] распространили на константы классов и case-ы перечислений, а магический метод __debugInfo() заработал для enum. Сообщение об ошибке json_decode() теперь указывает позицию, на которой разбор сломался, — отладка кривого JSON от чужого API станет ощутимо быстрее. Из прикладного: Uri\Rfc3986\UriBuilder для сборки ссылок, IntlNumberRangeFormatter для диапазонов чисел, grapheme_strrev(), mysqli::quote_string(), gmp_powm_sec() и gmp_prevprime().
Безопаснее по умолчанию: сессии и TLS
Изменение, которое затронет владельцев сайтов, даже если они не пишут код. Настройки сессий поменяли значения по умолчанию: session.use_strict_mode теперь 1, session.cookie_httponly тоже 1, а session.cookie_samesite — Lax. Это защита от фиксации сессии, от чтения куки скриптами на странице и от базовых CSRF-сценариев. Раньше всё это надо было включать руками, и на большинстве хостингов оно оставалось выключенным.
Есть нюанс: SameSite=Lax может сломать сценарии, где сессия должна переживать переход с чужого домена методом POST — типичный пример это возврат от платёжного шлюза. Такие места стоит проверить заранее, а не в день обновления продакшена.
В OpenSSL и потоках добавили возобновление TLS-сессий, внешние PSK-ключи и режим ранних данных TLS 1.3 (0-RTT). Для сервисов, которые делают много исходящих HTTPS-запросов к одним и тем же хостам — а это любая интеграция с внешним API — экономия на повторных рукопожатиях складывается в заметные миллисекунды.
Что ломается и от чего пора отвыкать
Список обратно несовместимых изменений в этот раз небольшой, но проверить свой код стоит. Конструкторы и деструкторы больше не могут возвращать значения. Поведение __get() изменили для операторов ?? и empty(). Функция preg_grep() при ошибке PCRE возвращает false, а не частично заполненный массив, — раньше это молча приводило к потере данных. Функции trim(), ltrim(), rtrim() теперь по умолчанию срезают и символ перевода страницы \f. NUL-байты в путях к файлам и в аргументах сессионных функций отклоняются с ошибкой. Строже стали проверки в curl и GMP: вместо тихого усечения значений выбрасываются ValueError и TypeError.
Отдельно — длинный список устаревшего. Под deprecation попали is_double(), is_integer(), is_long(), doubleval(), strcoll(), metaphone(), spl_object_hash(), spl_classes(), mysqli_get_charset(), константа SORT_LOCALE_STRING, третий аргумент define(), а также функции с именем readonly и использование namespace в качестве имени константы класса. Устарело расширение mbregex — библиотека Oniguruma, на которой оно построено, больше не поддерживается. Ещё одна деталь для тех, кто активно работает с потоковыми фильтрами: использование более 16 фильтров без настройки filter.max_filter_count теперь считается устаревшим.
Алиасы вроде is_integer() живут в легаси-коде десятилетиями — в старых плагинах и темах их встречается предостаточно. Deprecation не ломает работу сразу, но засоряет логи предупреждениями и обещает удаление в PHP 9.
Когда выйдет и что делать сейчас
Календарь релиза известен заранее. Beta 2 — 27 августа, Beta 3 — 10 сентября, «жёсткая» заморозка возможностей — 22 сентября. Дальше четыре релиз-кандидата: 24 сентября, 8 и 22 октября, 5 ноября. Финальный релиз PHP 8.6.0 запланирован на 19 ноября 2026 года.
Бета-версию нельзя ставить на боевые серверы — об этом прямо предупреждает анонс на php.net. Но развернуть её в контейнере и прогнать тесты своего проекта — ровно то, чего ждут разработчики ядра: чем раньше найдётся регрессия, тем выше шанс, что её починят до ноября. Владельцам сайтов на WordPress и WooCommerce торопиться некуда: экосистема плагинов подтягивается к новым мажорным версиям PHP месяцами, и разумная стратегия прежняя — дождаться 8.6.1–8.6.3 и подтверждённой совместимости ключевых плагинов. А вот заглянуть в файл UPGRADING из репозитория php-src и поискать по своему проекту устаревшие функции полезно уже сегодня: до релиза три месяца, и это лучшее время, чтобы разгрести легаси без спешки.
Частые вопросы
Общедоступный релиз PHP 8.6.0 запланирован на 19 ноября 2026 года. До этого выйдут Beta 2 (27 августа), Beta 3 (10 сентября) и четыре релиз-кандидата — 24 сентября, 8 и 22 октября, 5 ноября.
Это способ создать новую функцию из существующей, подставив часть аргументов заранее. Вместо знака вопроса на месте пропущенного аргумента подставляется значение при вызове: str_replace(' ', '-', ?) вернёт замыкание с одним параметром. Раньше для этого приходилось писать замыкание вручную; особенно заметен выигрыш в цепочках с пайп-оператором |> из PHP 8.5.
Нет. Анонс на php.net прямо предупреждает, что это ранняя тестовая версия и её нельзя использовать в продакшене. Бета предназначена для тестирования проектов в изолированном окружении и отправки отчётов об ошибках в трекер php-src.
Напрямую — новые значения по умолчанию для сессий (use_strict_mode и cookie_httponly включены, cookie_samesite = Lax) и предупреждения об устаревших функциях в логах, если в плагинах или темах остались вызовы вроде is_integer() или spl_object_hash(). Обновляться сразу после выхода 8.6 не стоит: экосистема плагинов обычно подтягивается к новой мажорной версии несколько месяцев.
Источники
- 1.PHP: PHP 8.6.0 Beta 1 available for testing (php.net, 13.08.2026)https://www.php.net/archive/2026.php
- 2.PHP 8.6 UPGRADING (php-src, тег php-8.6.0beta1)https://github.com/php/php-src/blob/php-8.6.0beta1/UPGRADING
- 3.PHP 8.6 release schedule — wiki.php.net/todo/php86https://wiki.php.net/todo/php86
- 4.PHP RFC: Partial Function Application — Optional Parametershttps://wiki.php.net/rfc/partial_function_application_optional_placeholder
- 5.What's new in PHP 8.6 — stitcher.iohttps://stitcher.io/blog/new-in-php-86
- 6.PHP 8.6: What's New and Changed — PHP.Watchhttps://php.watch/versions/8.6



