PHP 8.1 є основною новою версією PHP, яка приносить кілька нових функцій, покращує якість життя та намагається підготувати PHP до згладжування деяких його застарілих функцій шляхом відмови від підтримки та обмеження певних небажаних функцій.
PHP 8.1 є продовженням прогресу PHP у вдосконаленні системи типів. Він також додає більше функцій, які стимулюють захисне програмування.
Менеджерами релізів для PHP 8.1 є Джо Уоткінс, Бен Ремсі та Патрік Аллаерт. Вони будуть випускати незначні оновлення із серії PHP 8.1, поки PHP 8.1 не закінчиться в кінці 2024 року.
Деякі з основних моментів PHP 8.1 включають підтримку Enums, Fibers, тип ніколи не повертається, типи перетину, властивості тільки для читання та першокласний синтаксис виклику. Він також не підтримує кілька функцій, які можуть створити певні труднощі під час оновлення застарілих програм PHP до PHP 8.1.
PHP 8.1 додає такі функції, як Enums, яка була однією з найбільш частих і очікуваних функцій PHP. Крім того, він додає Fibers, що робить значний крок до одночасних програм PHP, що виводить PHP за межі традиційного шаблону запит-відповідь.
PHP 8.1 додає підтримку перелічувань. Enumeration або скорочено Enum — це перерахований тип, який має фіксовану кількість можливих значень.
Популярною аналогією для Enum є масті в колоді гральних карт. Колода гральних карт складається з чотирьох мастей, і вони фіксовані: трефи, бубни, серця та піки.
У PHP ці костюми можна перерахувати за допомогою Enum:
enum Suit { case Clubs; case Diamonds; case Hearts; case Spades; }
За допомогою Suit Enum тепер можна застосовувати типи під час прийняття або повернення значення suit:
function pick_card(Suit $suit) {}
pick_card(Suit::Clubs); pick_card(Suit::Diamonds); pick_card(Suit::Hearts); pick_card(Suit::Spades);
На відміну від внутрішнього використання спеціальних рядків або чисел (тобто магічних чисел) для зберігання та роботи з параметрами, Enums робить код програми більш читабельним і уникає несподіваного стану програми.
Волокна
Fibers — це нова функція в PHP 8.1, яка забезпечує легкий і контрольований паралельний доступ до PHP.
По суті, волокно — це блок коду, який підтримує власний стек (змінні та стан), який може бути запущений, призупинений або завершений спільно основним кодом і волокном.
Волокна схожі на нитки в комп’ютерній програмі. Потоки плануються операційною системою і не гарантують, коли і в який момент потоки призупиняються та відновлюються. Волокна створюються, запускаються, призупиняються та припиняються самою програмою, що дозволяє точно контролювати виконання основної програми та виконання волокна.
За допомогою Fibers блок коду всередині Fiber може призупинити кодовий блок і повернути будь-які дані назад до основної програми. Основна програма може відновити Fiber з точки, коли вона була призупинена.
Важливо, що одночасне виконання не означає одночасне виконання. Волокно саме по собі не дозволяє одночасно виконувати кілька волокон або основний потік і волокно. Однак це кроковий камінь для паралельних фреймворків PHP, щоб ефективно керувати своїм стеком виконання та дозволяти одночасне виконання.
PHP 8.1 підтримує властивості класу лише для читання. Властивість класу, оголошену лише для читання, можна ініціалізувати лише один раз, а подальші зміни властивості заборонені.
Властивості класу лише для читання оголошуються за допомогою контекстно-залежного ключового слова лише для читання у введеній властивості.
class User { public readonly int $uid; public function __construct(int $uid) { $this->uid = $uid; } }
З властивістю readonly (лише для читання) перезапис властивості або запис до неї з-за меж класу призводить до винятку.
$user = new User(42); $user->uid = 16; // Not allowed.
PHP 8.1 продовжує надавати синтаксис і функції для написання більш захисних і типізованих програм. Це також може означати, що PHP 8.1 додасть нові сповіщення про застарілість у застарілих програмах, якщо він містить невідповідні підписи для класів, або іноді відсутність типів при розширенні вбудованих класів PHP.
Типи перетину
PHP 8.1 підтримує типи перетину, що дозволяє оголошувати тип для параметрів, властивостей або типів, що повертаються, і забезпечувати належність значень до всіх оголошених типів класу/інтерфейсу. Це протилежність типу Union Types, який дозволяє будь-який із оголошених типів. Реалізація типів перетину в PHP 8.1 називається «чистими» типами перетину, оскільки об’єднання типів об’єднання та типів перетину в одній декларації заборонено.
Типи перетину оголошуються шляхом поєднання назв класів/інтерфейсів зі знаком &.
Для прикладу використання розглянемо вбудовані в PHP інтерфейси Iterator і Countable. Інтерфейс Iterator дає змогу виконувати ітерацію об’єкта класу за допомогою foreach. Однак, якщо той самий клас не реалізує інтерфейс Countable, неможливо викликати функцію count() для таких об’єктів.
За допомогою типу перетину тепер можна перевіряти типи об’єктів класу для реалізації інтерфейсів Iterator і Countable.
function count_and_iterate(Iterator&\Countable $value) { foreach($value as $val) {} count($value); }
У прикладі, навденому вище параметр $value має бути об’єктом із класу, який реалізує інтерфейси Iterator та Countable. Передача будь-якого іншого значення спричиняє помилку типу.
never return type
У PHP 8.1 додано новий тип повернення.
Функція/метод, який оголошується з типом never return, вказує на те, що він ніколи не повертає значення, і завжди викликає виняток або завершується викликом die/exit.
Тип never return подібний до існуючого типу повернення void, але тип never гарантує, що програма завершить роботу або викине. Іншими словами, функція/метод, оголошений ніколи, не повинен взагалі викликати return, навіть у поверненні; форму.
function redirect(string $url): never { header('Location: ' . $url); exit(); }
resource to object migrate
PHP 8.1 продовжує свої зусилля щодо міграції застарілих типів ресурсів до стандартних класів. У PHP 8.1 внесено такі зміни:
PHP 8.1 додає підтримку алгоритмів хешування xxHash і MurMurHash3. Вони є одними з найшвидших алгоритмів хешування і можуть легко пережовувати дані майже зі швидкістю носія. PHP є першою мовою програмування, яка включила ці два алгоритми хешування до своєї стандартної бібліотеки.