На сьогоднішній день немає версії PHP 8.5. Останньою стабільною версією PHP є 8.0, а наступною запланованою є PHP 8.1. Якщо ви шукаєте інформацію про нові функції у PHP 8.1, я можу допомогти.

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 18 жовтня, 2025
Чи готові ви дізнатися про найбільші новинки PHP 8.5, які змінюють правила гри для розробників? У нашій статті ми розглянемо нові можливості, такі як оператор Pipe, функції array_first() і array_last(), а також інші захоплюючі вдосконалення

Випуск PHP 8.5 відбудеться наступного місяця, 20 листопада 2025 року. Серед нововведень — оператор Pipe, нове URI-розширення, функції array_first() та array_last(), а також багато іншого:

Для повного списку відвідайте сторінку 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, якщо плануєте оновлення. 😎