Випуск PHP 8.5 відбудеться наступного місяця, 20 листопада 2025 року. Серед нововведень — оператор Pipe, нове URI-розширення, функції array_first() та array_last(), а також багато іншого:
- Оператор Pipe
- Функції array_first() та array_last()
- Нове URI-розширення
- Отримання виконуючого Closure
- Слідкування за фатальними помилками PHP
- Опція INI Diff
- І багато іншого...
Для повного списку відвідайте сторінку PHP 8.5 RFC.
# Оператор Pipe
Оператор 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');
# Функції array_first() і array_last()
У 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]); // "привіт" (без об'єктної прив'язки)
# Нове URI-розширення
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/
# Отримання виконуючого Closure
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}
# Опція INI Diff
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, якщо плануєте оновлення. 😎