До основного вмісту

PHP 8.5: що нового і коли переходити

PHP · 09.11.2026 · 5 хв читання

Чому читати про PHP 8.5 саме зараз

31 грудня 2026 року, за півтора місяця, у гілки 8.2 закінчується будь-яка підтримка, а у гілки 8.4 — активна: залишаться лише виправлення безпеки, до 31 грудня 2028 року. Якщо сайт працює на 8.2, питання не в тому, переходити чи ні, а в тому, на що. Терміни взято зі сторінки php.net/supported-versions.

ГілкаВипускАктивна підтримка доВиправлення безпеки до
8.28 грудня 202231 грудня 202431 грудня 2026
8.323 листопада 202331 грудня 202531 грудня 2027
8.421 листопада 202431 грудня 202631 грудня 2028
8.520 листопада 202531 грудня 202731 грудня 2029

Для нового проєкту беріть 8.5: безпека в неї до 31 грудня 2029 року. Гілка 8.3 доживає до 31 грудня 2027 року і підходить як проміжна, якщо залежності ще не готові до 8.5. Гілка 8.1 з 31 грудня 2025 року не підтримується взагалі (php.net/eol.php). Актуальний патч 8.5 за журналом змін php.net — 8.5.12 від 22 жовтня 2026 року (на початок листопада 2026 року); звірте номер перед оновленням.

Що нового в PHP 8.5

PHP 8.5 вийшов 20 листопада 2025 року. Головне в ньому — оператор конвеєра, атрибут NoDiscard, клонування зі зміною властивостей і два давно очікувані помічники для масивів. Усе перелічене нижче підтверджено файлом UPGRADING гілки PHP-8.5 та релізною сторінкою php.net.

  • оператор конвеєра |>;
  • атрибут #[\NoDiscard] і приведення (void);
  • замикання та first-class callable у константних виразах;
  • clone із параметром (clone with);
  • розширення URI, яке тепер завжди ввімкнене;
  • array_first() і array_last();
  • постійні cURL share-handles;
  • трасування стека при фатальних помилках;
  • get_error_handler() і get_exception_handler();
  • OPcache, який тепер завжди вбудований.

Оператор конвеєра

Оператор |> передає результат лівої частини у викликане праворуч, тому ланцюжок перетворень читаєш зліва направо, а не зсередини назовні. Праворуч стоїть викликане з одним аргументом: функція, метод або first-class callable. Стрілкову функцію беріть у дужки.

$slug = "  Hello PHP 8.5  "
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(" ", "-", $s));

echo $slug; // hello-php-8.5

Без конвеєра те саме записувалося б вкладеними викликами: str_replace(" ", "-", strtolower(trim($s))). Читати такий запис доводиться з кінця.

NoDiscard, clone with і array_first()

Три невеликі нововведення, які помітніші за все в повсякденному коді. Атрибут #[\NoDiscard] змушує PHP попереджати, якщо результат виклику проігноровано, а приведення (void) явно каже «результат не потрібен». clone приймає масив властивостей, а array_first() і array_last() замінюють обхідні прийоми на кшталт reset() і end().

#[\NoDiscard]
function saveOrder(array $data): bool { return true; }

saveOrder($data);         // попередження: результат проігноровано
(void) saveOrder($data);  // явно: результат не потрібен

$moved = clone($address, ["city" => "Kyiv"]);
$first = array_first([10, 20, 30]); // 10
$last  = array_last([10, 20, 30]);  // 30

Для порожнього масиву array_first() поверне null. Попередню версію розбирає стаття про PHP 8.4, а про сувору типізацію, яка добре поєднується з NoDiscard, написано у статті про strict_types.

Розширення та середовище: URI, cURL, OPcache

Частина новинок стосується не мови, а середовища, і для хостингу вона важливіша за синтаксис. Розширення URI завжди ввімкнене і дає класи Uri\Rfc3986\Uri та Uri\WhatWg\Url для розбору адрес за стандартами. Постійні cURL share-handles створює функція curl_share_init_persistent(). Трасування при фатальних помилках вмикає параметр fatal_error_backtraces. OPcache тепер вбудований у PHP завжди.

Що справді ламає робочий код

Код ламають не застарілі можливості, а розділ несумісних змін в UPGRADING: застарілі (deprecated) лише видають попередження E_DEPRECATED. Для хостингу важливі пункти нижче; перевірте їх до зміни версії, а не після помилки в журналі.

  • видалено INI-директиву disable_classes: приберіть її з php.ini та з пулів FPM;
  • рядок zend_extension=opcache тепер дає попередження, бо OPcache вбудований;
  • змінено значення констант PDO::FETCH_GROUP, PDO::FETCH_UNIQUE, PDO::FETCH_CLASSTYPE, PDO::FETCH_PROPS_LATE та PDO::FETCH_SERIALIZE: числа замість констант у коді доведеться замінити;
  • розширення intl вимагає ICU 57.1 або новішу;
  • ключ $_SESSION із символом | дає попередження;
  • приведення NAN і значень float поза діапазоном до int дає попередження.

Перелік не вичерпний: пройдіть розділ несумісних змін в UPGRADING повністю.

Застаріле: що трапляється у старому коді

Застарілі можливості продовжують працювати, але дають E_DEPRECATED і згодом можуть бути видалені. У старому коді найчастіше трапляються чотири: приведення (boolean), (integer) і (double), зворотні лапки замість shell_exec(), функція curl_close() та null у ролі ключа масиву. Перелік узято з розділу Deprecated Functionality в UPGRADING.

ЗастарілоЧим замінити
(boolean), (integer), (double)(bool), (int), (float)
зворотні лапкиshell_exec()
curl_close()прибрати виклик, дескриптор звільняється сам
null як ключ масивуявний ключ, наприклад порожній рядок

Коли і як переходити

Переходьте на 8.5, коли залежності проєкту заявляють його підтримку; якщо ви на 8.2, зробіть це до кінця грудня. Не змінюйте версію на бойовому сайті «на місці»: поставте другу версію поруч, прогоніть тести й перемкніть пул.

  1. На копії сайту ввімкніть виведення всіх помилок і зберіть журнал на поточній версії.
  2. Поставте 8.5 поруч із робочою версією, як описано у статті про кілька версій PHP на одному сервері.
  3. Пройдіть перелік несумісних змін і знайдіть їх у конфігах та коді.
  4. Оновіть залежності Composer і прогоніть тести на 8.5.
  5. Перемкніть один пул FPM або один сайт і простежте за журналом.
  6. Залиште попередню версію встановленою на час, достатній для відкату.
php -v
grep -rn "disable_classes" /etc/php/
grep -rn "zend_extension" /etc/php/
grep -rnE "\((boolean|integer|double)\)" --include=*.php .
grep -rn "curl_close" --include=*.php .

Як отримувати виправлення безпеки для встановленої гілки, написано у статті про оновлення PHP на Ubuntu і Debian.

Часті запитання

Чи потрібно йти з PHP 8.2 до кінця року?

Так. 31 грудня 2026 року у гілки 8.2 закінчується підтримка, зокрема виправлення безпеки. Після цієї дати вразливості в ній закриватися не будуть.

Чи підійде PHP 8.4, якщо 8.5 поки зарано?

Підійде на певний час: активна підтримка 8.4 закінчується 31 грудня 2026 року, а виправлення безпеки виходять до 31 грудня 2028 року. Для нового проєкту розумніше одразу 8.5.

Чи зламають мій сайт застарілі функції?

Ні, вони лише видають попередження. Ламають код пункти з розділу несумісних змін: видалена директива, змінені константи, вимоги до ICU.

Що робити клієнтам ZevsHost?

На спільному хостингу версію PHP перемикає панель, і оновлювати сервер не потрібно: оберіть версію для сайту та перевірте журнал. На VPS і виділеному сервері версію та оновлення обираєте ви самі.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці