PHP 8.5 вийде наступного місяця, 20 листопада 2025 року, і включатиме оператор Pipe, нове розширення URI, нові функції array_first() і array_last() та багато іншого:
Дивіться на сторінку PHP 8.5 RFC для повного списку нововведень.
Оператор Pipe дає можливість PHP-розробникам зручно комбінувати кілька викликів, передаючи значення зліва направо:
// Використання оператора Pipe у PHP 8.5
$result = "Hello World"
|> htmlentities(...)
|> str_split(...)
|> fn($x) => array_map(strtoupper(...), $x)
|> fn($x) => array_filter($x, fn($v) => $v != 'O');
PHP 8.5 додасть функції array_first() і array_last(). Хоча на перший погляд це може видатися незначним (багато в спільноті вже використовують альтернативні версії), ці функції є давно очікуваними в рідному синтаксисі PHP.
Ці функції доповнюють методи array key, які були додані в PHP 7.3:
У PHP 7.3 були представлені
array_key_first()іarray_key_last()для отримання перших та останніх ключів масиву. Проте досі немає способу отримати перші та останні значення масиву. Це не так просто, як здається, оскільки:
- Ключі масиву можуть бути нецілими числами і не починатися з 0.
- Старіші "трюки" на кшталт
reset()іend()змінюють "внутрішній ітератор" масиву, що може викликати проблеми в різних ситуаціях (наприклад, масиви, які повертаються з функцій).- Використання
$array[array_key_first($array)]є обтяжливим.
Якщо вам цікаво дізнатися більше про array_first() і array_last(), у нас є детальніший пост. А ось кілька прикладів підписів функцій та їх роботи:
// Підписи функцій
function array_first(array $array): mixed {}
function array_last(array $array): mixed {}
// Приклади
array_first(["єдиний елемент"]); // "єдиний елемент"
array_last(["єдиний елемент"]); // "єдиний елемент"
array_first([]); // NULL
array_last([]); // NULL
array_first([1 => 'a', 0 => 'b', 3 => 'c', 2 => 'd']); // 'a'
array_last([1 => 'a', 0 => 'b', 3 => 'c', 2 => 'd']); // 'd'
$str = "hello";
array_first([&$str, false]); // "hello" (без посилання)
array_last([false, &$str]); // "hello" (без посилання)
PHP 8.5 представляє нове розширення URI, яке є відповідним стандартом парсером "для RFC 3986 та стандарту URL WHATWG у складі стандартної бібліотеки в новому розширенні 'URI'." RFC містить безліч прикладів; ось один із анонсу PHP Foundation, який демонструє клас Uri для RFC 3986:
use Uri\Rfc3986\Uri;
$url = new Uri('HTTPS://thephp.foundation:443/sp%6Fnsor/');
$defaultPortForScheme = match ($url->getScheme()) {
'http' => 80,
'https' => 443,
'ssh' => 22,
default => null,
};
// Видалення стандартних портів з URL.
if ($url->getPort() === $defaultPortForScheme) {
$url = $url->withPort(null);
}
// Getter-и нормалізують URL за замовчуванням. Варіанти `Raw` повертають вхідні дані без змін.
echo $url->toString(), PHP_EOL;
// Виведе: https://thephp.foundation/sponsor/
echo $url->toRawString(), PHP_EOL;
// Виведе: HTTPS://thephp.foundation/sp%6Fnsor/
PHP 8.5 підтримуватиме рекурсію в замиканнях шляхом отримання поточно виконуваного замикання (головна заслуга Александра Дубуа). У цій RFC зазначено, що нинішнє рішення полягає в прив'язуванні посилання на змінну в замиканні. PHP 8.5 впроваджує статичний Closure::getCurrent() для отримання поточного замикання:
$fibonacci = function (int $n) {
if (0 === $n || 1 === $n) {
return $n;
}
$fn = Closure::getCurrent();
return $fn($n - 1) + $fn($n - 2);
};
echo $fibonacci(10) . "\n";
PHP 8.5 впроваджує підтримку замикань у константних виразах, що дозволяє визначати значення атрибутів за замовчуванням як Closure, серед інших можливостей:
function my_array_filter(
array $array,
Closure $callback = static function ($item) { return !empty($item); },
) {
$result = [];
foreach ($array as $item) {
if ($callback($item)) {
$result[] = $item;
}
}
return $result;
}
my_array_filter([
0, 1, 2,
'', 'foo', 'bar',
]); // [1, 2, "foo", "bar"]
Дивіться наш детальний пост про цю можливість, щоб дізнатися більше.
У PHP 8.5 з'явиться новий параметр fatal_error_backtraces, який контролює, чи відображається стек викликів у разі фатальних помилок. За замовчуванням, параметр fatal_error_backtraces дорівнюватиме 1 — вам не потрібно налаштовувати нічого, щоб отримати ці стеки (однак ви можете їх вимкнути, якщо хочете). Фатальні помилки без стеків викликів у стабільних версіях PHP (наприклад, PHP 8.4) можуть включати синтаксичні помилки, дублікати функцій або класів, безкінечні цикли з максимальним часом виконання тощо.
Фатальна помилка: неможливо повторно оголосити клас B (раніше оголошений у /srv/app/index.php:11) в /srv/app/b.php на рядку 3
Стек викликів:
#0 /srv/app/index.php(6): require()
#1 /srv/app/index.php(21): A->loadClassB()
#2 {main}
PHP 8.5 вводить опцію INI Diff для прапора php --ini, що дозволяє легко виявляти змінені INI-налаштування у вашій конфігурації. Прапор --ini корисний для показу завантаженого файлу конфігурації php.ini, а також додаткових .ini файлів:
$ php --ini=diff
Ненормальні налаштування INI:
allow_url_include: "0" -> ""
auto_append_file: (none) -> ""
auto_prepend_file: (none) -> ""
display_errors: "1" -> ""
display_startup_errors: "1" -> ""
enable_dl: "1" -> ""
error_reporting: (none) -> "22527"
...
Графік релізу PHP 8.5 включає ще два кандидатські випуски та остаточний реліз 20 листопада:
| Дата | Назва випуску |
|---|---|
| 03 липня 2025 | Alpha 1 |
| 17 липня 2025 | Alpha 2 |
| 31 липня 2025 | Alpha 3 (пропущений) |
| 31 липня 2025 | Alpha 4 |
| 12 серпня 2025 | Замороження функцій |
| 14 серпня 2025 | Beta 1 |
| 28 серпня 2025 | Beta 2 |
| 11 вересня 2025 | Beta 3 |
| 25 вересня 2025 | RC1 |
| 09 жовтня 2025 | RC2 |
| 23 жовтня 2025 | RC3 |
| 06 листопада 2025 | RC4 |
| 20 листопада 2025 | GA |
| Графік випуску детально описано на сторінці підготовки PHP 8.5. |
PHP 8.5 має безліч інших оновлень - ви можете ознайомитися з повним списком RFC в рамках релізу в листопаді. Сторінка підготовки PHP 8.5 містить графік випусків. Щоб почати використовувати PHP 8.5 вже зараз, ви можете завантажити джерела PHP 8.5 RC зі сторінки завантажень. Також ви можете скористатися списком декларацій PHP 8.5, щоб попередньо підготуватися до оновлень 😎