Чому читати про PHP 8.5 саме зараз
31 грудня 2026 року, за півтора місяця, у гілки 8.2 закінчується будь-яка підтримка, а у гілки 8.4 — активна: залишаться лише виправлення безпеки, до 31 грудня 2028 року. Якщо сайт працює на 8.2, питання не в тому, переходити чи ні, а в тому, на що. Терміни взято зі сторінки php.net/supported-versions.
| Гілка | Випуск | Активна підтримка до | Виправлення безпеки до |
|---|---|---|---|
| 8.2 | 8 грудня 2022 | 31 грудня 2024 | 31 грудня 2026 |
| 8.3 | 23 листопада 2023 | 31 грудня 2025 | 31 грудня 2027 |
| 8.4 | 21 листопада 2024 | 31 грудня 2026 | 31 грудня 2028 |
| 8.5 | 20 листопада 2025 | 31 грудня 2027 | 31 грудня 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, зробіть це до кінця грудня. Не змінюйте версію на бойовому сайті «на місці»: поставте другу версію поруч, прогоніть тести й перемкніть пул.
- На копії сайту ввімкніть виведення всіх помилок і зберіть журнал на поточній версії.
- Поставте 8.5 поруч із робочою версією, як описано у статті про кілька версій PHP на одному сервері.
- Пройдіть перелік несумісних змін і знайдіть їх у конфігах та коді.
- Оновіть залежності Composer і прогоніть тести на 8.5.
- Перемкніть один пул FPM або один сайт і простежте за журналом.
- Залиште попередню версію встановленою на час, достатній для відкату.
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 і виділеному сервері версію та оновлення обираєте ви самі.