Випуск 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, якщо плануєте оновлення. 😎
PHP 8.5 обіцяє безліч нових можливостей, таких як оператор Pipe, функції `array_first()` та `array_last()`, а також нове розширення URI. Чи готові ви дізнатися, як ці функції можуть спростити вашу розробку? Читайте далі, щоб дізнатися більше про ці захоплюючі нововведення
Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті
Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!