Реліз PHP 8.5 відбувся 20 листопада 2025 року. Нова версія принесла оператор Pipe, конструкцію clone with, оновлений URI-парсер та низку інших покращень.
Оператор Pipe
PHP 8.5 представляє оператор Pipe, який значно спрощує передачу результату однієї функції в іншу. Замість складних вкладених викликів:
$input = ' Some kind of string. '; $output = strtolower( str_replace(['.', '/', '…'], '', str_replace(' ', '-', trim($input) ) ) );
Тепер можна використовувати чистіший синтаксис:
$output = $input |> trim(...) |> (fn (string $string) => str_replace(' ', '-', $string)) |> (fn (string $string) => str_replace(['.', '/', '…'], '', $string)) |> strtolower(...);
Більше деталей про роботу нового оператора читайте у детальному огляді.
Clone with
З'явилася можливість призначати нові значення властивостям об’єкта безпосередньо під час його клонування:
final class Book { public function __construct( public string $title, public string $description, ) {} public function withTitle(string $title): self { return clone($this, [ 'title' => $title, ]); } }
Це корисне нововведення, хоча воно має обмеження: конструкція не працює з readonly властивостями ззовні класу. Для цього доведеться змінити доступ на public(set).
Каст (void) та атрибут #[NoDiscard]
Тепер функцію можна позначити атрибутом #[NoDiscard]. Це означає, що її результат обов'язково має бути використаний. Якщо результат ігнорується, PHP видасть попередження.
#[NoDiscard("Результат цієї функції є критично важливим.")] function foo(): string { return 'hi'; } // Попередження: // The return value of function foo() is expected to be consumed... foo(); // Коректне використання: $string = foo();
Попередження можна приглушити за допомогою нового касту (void):
(void) foo();
Покращення Closures
Closures та first-class callables тепер можна використовувати у константних виразах. Це дозволяє, наприклад, визначати анонімні функції прямо в атрибутах:
#[SkipDiscovery(static function (Container $container): bool { return ! $container->get(Application::class) instanceof ConsoleApplication; })] final class BlogPostEventHandlers { /* … */ }
Такі Closures повинні бути чітко позначені як static, оскільки вони не мають доступу до $this або зовнішніх змінних через use.
Backtraces для фатальних помилок
Маленька, але надзвичайно корисна зміна: тепер фатальні помилки міститимуть стек викликів (backtrace), що значно полегшує дебаг.
Fatal error: Maximum execution time of 1 second exceeded in example.php on line 6
Stack trace:
#0 example.php(6): usleep(100000)
#1 example.php(7): recurse()
...
#11 {main}Функції array_first() та array_last()
Після появи array_key_first() у PHP 7.3, ми нарешті отримали вбудовані функції для отримання значень першого та останнього елементів масиву. Замість громіздких конструкцій:
$first = $array[array_key_first($array)] ?? null;
Тепер достатньо написати:
$first = array_first($array);
Парсинг URI
Нова реалізація URI дозволяє зручніше працювати з компонентами адрес:
use Uri\Rfc3986\Uri; $uri = new Uri('https://tempestphp.com/2.x/getting-started/introduction'); $uri->getHost(); $uri->getScheme(); $uri->getPort();
Атрибут #[DelayedTargetValidation]
Деякі вбудовані атрибути (як-от #[Override]) валідуються під час компіляції. Новий атрибут #[DelayedTargetValidation] дозволяє відкласти цю перевірку до моменту виконання (runtime). Це важливо для підтримки зворотної сумісності.
Інші зміни
- Підтримка Asymmetric visibility для статичних властивостей.
- Атрибути для констант, визначених поза класами.
- Constructor property promotion для
finalвластивостей. - Можливість застосовувати
#[Override]до властивостей. - Додано
Dom\Element::$outerHTML. - Розширення Exif тепер підтримує формати HEIF та HEIC.
- Новий прапор
FILTER_THROW_ON_FAILUREдляfilter_var().
Застарілі функції та зміни, що порушують сумісність
- Нестандартні імена кастів, як-от
(boolean)та(integer), оголошені застарілими (використовуйтеboolтаint). - Використання зворотних лапок (backticks) як аліасу для
shell_exec()є застарілим. - Переоголошення констант тепер вважається застарілим.
- Видалено налаштування
disabled_classesв ini-файлі.
Це основні нововведення PHP 8.5. Повний список усіх змін доступний за цим посиланням.
Що ви думаєте про PHP 8.5? Діліться своїми думками у коментарях!