Що нового у PHP 8.6: головні оновлення та нові можливості

Перекладено ШІ 0 stitcher.io 05 серпня, 2026

PHP 8.6 запропонує розробникам Partial function application, нове Polling API та розширені можливості для readonly-властивостей. Розповідаємо про ключові зміни, які незабаром стануть стандартом для кожного Laravel-розробника.

Реліз PHP 8.6 очікується 19 листопада 2026 року. Серед головних нововведень: часткове застосування функцій (partial function application), новий Polling API, doc-коментарі для параметрів функцій, низка застарілих функцій (deprecations) та багато іншого.

До речі! Якщо ви ще не брали участі в опитуванні State of PHP 2026, зараз — найкращий час приділити цьому 15-20 хвилин. Це спільний проєкт PHP Foundation та JetBrains, мета якого — отримати максимально точну картину PHP-спільноти. Понад 8000 розробників уже долучилися, але нам важливо почути кожного.


Часткове застосування функцій (PFA)

Partial function application (PFA) дозволяє створювати посилання на Closure із частиною вже заповнених параметрів. Простий приклад — функція для заміни пробілів на дефіси в рядку:

$makeSlug = str_replace(' ', '-', ?);

Після створення Closure її можна викликати так:

$makeSlug('Hello World');

// Hello-World

PFA особливо корисний у поєднанні з pipe operator, оскільки цей оператор завжди вимагає Callable з одним параметром.

$output = 'Hello World' 
    |> str_replace(' ', '-', ?)
    |> strtolower(...);

// hello-world

Детальніше про часткове застосування функцій читайте у цьому дописі.


Значення за замовчуванням для readonly-властивостей

З появою хуків властивостей (property hooks) у PHP 8.4 стало можливим визначати їх в інтерфейсах:

interface MigratesUp
{
    public string $name { get; }

    public function up(): QueryStatement;
}

Це оновлення робить логічним використання readonly-властивостей із дефолтними значеннями у багатьох сценаріях:

final class CreateBooksTable implements MigratesUp
{
    public readonly string $name = '2026-01-01_create_books_table';
    
    public function up(): QueryStatement
    { /* … */ }
}

Раніше в PHP не можна було призначати початкові значення для readonly-властивостей. Це було свідомим рішенням, адже така властивість фактично перетворювалася на константу. Проте тепер, коли ми маємо хуки в інтерфейсах, незмінне значення за замовчуванням стає частиною контракту класу.

Тому відтепер дефолтні значення для readonly-властивостей дозволені!

final class CreateBooksTable implements MigratesUp
{
    // ✅ Тепер працює
    public readonly string $name = '2026-01-01_create_books_table';
    
    // …
}

Polling API

Новий Polling API створений насамперед для спрощення внутрішньої розробки PHP. Такі компоненти, як PHP-FPM та обробка сигналів у режимі ZTS (Zend Thread Safety), отримають уніфіковану платформу. Водночас API доступний і для розробників (userland), що дозволить таким фреймворкам, як ReactPHP або Amp, використовувати його можливості:

use Io\Poll\Context;
use Io\Poll\Event;
use Io\Poll\StreamPollHandle;
 
// Створення контексту опитування з автоматичним вибором бекенду
$context = new Context();

// Створення неблокуючого сокета
$stream = stream_socket_server('tcp://0.0.0.0:8080', $errno, $errstr);
stream_set_blocking($stream, false);

// Обгортання стріму в StreamPollHandle для використання нового API
$handle = new StreamPollHandle($stream);
 
// Додавання хендла в контекст
$context->add($handle, [Event::Read], ['type' => 'server']);

while (true) {
    // Очікування подій протягом однієї секунди
    $watchers = $context->wait(1);
    
    // …
}

Варто розуміти, що цей API не додає в PHP нових асинхронних можливостей «з коробки». Це лише зручніший спосіб взаємодії з ними — раніше єдиним варіантом для мультиплексування I/O був stream_select(). Оскільки новий API підтримує такі бекенди, як epoll або WSAPoll, продуктивність на високих навантаженнях буде значно кращою.

Polling API також не має вбудованого Event Loop, тому реалізація високорівневих абстракцій залишається за сторонніми бібліотеками.


Нова функція clamp

clamp() — популярна функція в багатьох фреймворках, яка тепер стане частиною ядра PHP 8.6. Вона гарантує, що значення (числове або інше) знаходиться в заданих межах. Якщо значення виходить за рамки, функція повертає найближчу межу.

clamp(10, min: 0, max: 100); // Поверне 10
clamp(101, min: 0, max: 100); // Поверне 100
clamp(-1, min: 0, max: 100); // Поверне 0

clamp() працює не лише з числами, а й, наприклад, з рядками:

clamp("y", "x", "z") // Поверне "y"
clamp("a", "x", "z") // Поверне "x"

Або з об'єктами DateTime:

clamp(
    value: new DateTimeImmutable('2025-01-01'), 
    min: new DateTimeImmutable('2026-01-01'), 
    max: new DateTimeImmutable('2026-12-31'),
); // Поверне DateTimeImmutable('2026-01-01')

Методи рефлексії isReadable та isWriteable

Додано два методи для перевірки того, чи доступна властивість для читання або запису. Після впровадження хуків властивостей у PHP 8.4 ці методи стали необхідним доповненням до Reflection API:

final class Book
{
    private(set) string $title;
}

$property = new ReflectionProperty(Book::class, 'title');

$property->isReadable(scope: Book::class);
$property->isWriteable(scope: null);

Параметр $scope критично важливий, оскільки він визначає контекст доступу. Наприклад, приватна властивість доступна для запису всередині класу, але не ззовні:

$property->isWriteable(scope: Book::class); // true
$property->isWriteable(scope: null); // false

Також можна передати другий параметр $object. Це дозволяє Reflection API перевірити, чи вже була встановлена readonly-властивість, що безпосередньо впливає на можливість її повторного запису.

final class Book
{
    public readonly string $title;
}

$book = new Book();

$property = new ReflectionProperty(Book::class, 'title');

$property->isWriteable(scope: null, object: $book); // true

$book->title = 'Timeline Taxi';

$property->isWriteable(scope: null, object: $book); // false

Doc-коментарі для параметрів функцій

Reflection API тепер підтримує метод getDocComment() для ReflectionParameter. Це дозволяє змінити такий підхід:

/** @param Book[] $books */
function store(array $books): void { /* … */ }

На такий:

function store(
    /** @param Book[] */
    array $books,
): void { /* … */ }

Коментар можна розмістити в один рядок з обох боків від параметра:

function store(/** @param Book[] */ array $books): void { /* … */ }
function store(array $books /** @param Book[] */): void { /* … */ }

Важливо: якщо коментар іде після параметра, він має стояти перед комою:

function store(
    array $books /** валідне розташування для $books */, 
    array $other, /** а цей коментар не буде виявлено */
): void { /* … */ }

Ця можливість найбільш корисна для статичних аналізаторів, але ви можете читати ці коментарі й через рефлексію:

$reflection = /* рефлексія методу або функції */

$parameters = $reflection->getParameters;

$parameters[0]->getDocComment();

Новий Enum SortDirection

PHP 8.6 запроваджує вбудований Enum для позначення напрямку сортування:

enum SortDirection {
    case Ascending;
    case Descending;
}

Фреймворки та бібліотеки зможуть використовувати його для стандартизації сортування. Хоча вбудовані функції на кшталт array_multisort() поки що його не підтримують, розробники планують додати цю підтримку в майбутньому.


Посилення безпеки сесій за замовчуванням

PHP змінює значення кількох INI-налаштувань, щоб зробити сесії безпечнішими «з коробки». session.use_strict_mode та session.cookie_httponly тепер за замовчуванням мають значення 1 (замість 0), а session.cookie_samesite отримає значення Lax.

session_use_strict_mode

Якщо додаток передає ID сесії ззовні (наприклад, між субдоменами), цей ID буде відхилено, якщо відповідного файлу сесії ще не існує. Тепер потрібно спочатку зберегти сесію через session_write_close() на стороні відправника.

session.cookie_httponly

Прапор HttpOnly забороняє JavaScript-коду читати значення сесійної куки через document.cookie. Це захищає ID сесії від крадіжки через XSS-атаки.

session.cookie_samesite

З SameSite=Lax браузер надсилатиме сесійну куку лише при переходах всередині сайту або при безпечних зовнішніх переходах (наприклад, за посиланням через GET). Це запобігає передачі куки при крос-доменних POST-запитах.


Дебаг для Enum

Тепер в Enum можна реалізувати магічний метод __debugInfo() для кастомізації виводу під час налагодження:

enum Status: int
{
    case OK = 200;
    
    public function __debugInfo() {
		return [__CLASS__ . '::' . $this->name . ' = ' . $this->value];
	}
}
 
var_dump(Status::OK);

Оголошення застарілими (Deprecations)

Як і кожен мінорний реліз, PHP 8.6 готує розробників до майбутніх змін, позначаючи певні конструкції як застарілі.

Повернення значення з блоку finally

Використання return у finally часто призводить до неочевидних багів, тому тепер це викликає попередження.

Слова let та is як ідентифікатори

PHP планує зарезервувати let та is для майбутнього синтаксису (наприклад, для покращення оператора match).

namespace як назва константи класу

Слово namespace буде зарезервоване для можливої появи псевдоконстанти ::namespace (аналогічно до ::class).

Застарілі аліаси функцій перевірки типів

Замість is_double() слід використовувати is_float(), а замість is_integer() та is_long()is_int().

spl_object_hash

Замість неї рекомендується використовувати швидшу та ефективнішу spl_object_id().

CSV-методи в SplFileObject

Такі методи, як fgetcsv() у SplFileObject, визнані застарілими. Обробка CSV не є природним завданням для цього класу, і в майбутньому її планують винести в окреме розширення.


Наразі це все! Список змін може оновитися до моменту Feature Freeze. Підписуйтесь на розсилку, щоб залишатися в курсі новин.

І наостанок: не забудьте пройти опитування State of PHP. Ваш досвід допоможе зробити PHP кращим!

Популярні

Інше, що варто прочитати

10 Оновлено 26 червня, 2026

Остаточний посібник з вебхуків у Laravel

Сучасні веб-додатки вимагають миттєвого обміну інформацією, і вебхуки стають незамінними помічниками у цьому процесі. Пориньте у світ вебхуків у Laravel і дізнайтеся, як легко реалізувати цю технологію у своїх проєктах, забезпечуючи безпеку та продуктивність

26 Оновлено 26 червня, 2026

Створення MCP-серверів на PHP

Модельний контекстний протокол (MCP) відкриває нові горизонти в інтеграції AI-додатків з PHP. Дізнайтеся, як легко створити сервер, що відповідає MCP, та які можливості відкриваються для вашого проєкту

15 Оновлено 26 червня, 2026

Як задокументувати кілька API в Laravel за допомогою Scramble

Ви знали, що в одному додатку Laravel можна реалізувати кілька API? У нашій статті ви дізнаєтеся, як за допомогою Scramble легко документувати різні версії API та налаштувати доступ до документації, щоб зробити її публічною або приватною. Читайте далі, щоб дізнатися більше