Випуск 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 вже є реалізації цих функцій), їх довго чекали як на вбудовані елементи мови.
Ці функції доповнюють методи ключів масиву, представлені у PHP 7.3:
У PHP 7.3 з'явилися
array_key_first()
таarray_key_last()
для отримання перших та останніх ключів масиву. Проте досі не вистачало можливості отримувати перші та останні значення масиву. Це виявляється складнішим, ніж здається, адже:
- Ключі масиву можуть бути не лише цілими числами.
- Сучасні "трюки", як
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 = "привіт";
array_first([$str, false]); // "привіт" (без об'єктної прив'язки)
array_last([false, &$str]); // "привіт" (без об'єктної прив'язки)
PHP 8.5 вводить нове URI-розширення, яке є стандартним парсером для RFC 3986 та стандарту URL від WHATWG, що входить до стандартної бібліотеки. Ось приклад класу 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);
}
// Getters нормалізують URL за замовчуванням. Варіанти `Raw` повертають вихідні дані.
echo $url->toString(), PHP_EOL;
// Виведе: https://thephp.foundation/sponsor/
echo $url->toRawString(), PHP_EOL;
// Виведе: HTTPS://thephp.foundation/sp%6Fnsor/
PHP 8.5 підтримуватиме рекурсію в Closure завдяки можливості отримувати поточний Closure (подяка Александру Добрішу). Наразі обхідний шлях передбачає прив'язування змінної до Closure. PHP 8.5 надає статичний метод Closure::getCurrent()
для отримання виконуючого Closure:
$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";
Нове налаштування fatal_error_backtraces контролює відображення стеку викликів для фатальних помилок. У PHP 8.5 за замовчуванням це налаштування дорівнює 1
, тож вам не потрібно нічого налаштовувати, щоб отримувати стеки викликів (проте їх можна за бажанням вимкнути). Фатальні помилки без стеку викликів в актуальних версіях PHP (наприклад, 8.4) можуть включати синтаксичні помилки, повторне оголошення функцій або класів, безкінечні цикли з максимальним часом виконання тощо.
Fatal error: Cannot redeclare class B (previously declared in /srv/app/index.php:11) in /srv/app/b.php on line 3
Stack trace:
#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, що включає ще два кандидатських випуски, після чого відбудеться GA-версія 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 |
9 жовтня 2025 | RC2 |
23 жовтня 2025 | RC3 |
6 листопада 2025 | RC4 |
20 листопада 2025 | GA |
Графік випуску можна знайти на сторінці підготовки PHP 8.5. |
У PHP 8.5 з'явиться ще багато оновлень - ви можете ознайомитися з повним списком RFC, які виходять у листопаді. Сторінка завдань підготовки PHP 8.5 містить графік виходу найближчих версій. Щоб почати використовувати PHP 8.5 вже зараз, ви можете завантажити RC-версію з сторінки завантажень. І наостанок, ви можете переглянути список депрекацій PHP 8.5, якщо плануєте оновлення. 😎