Що нового в PHP 8.5

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

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.

Ці функції доповнюють методи 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" (без посилання)

# Нове розширення URI

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

У 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}

# Опції 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 включає ще два кандидатські випуски та остаточний реліз 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, щоб попередньо підготуватися до оновлень 😎