Вийшов реліз мови програмування PHP 8.1: називаємо ключові оновлення
Розробники представили реліз мови програмування PHP 8.1. Працювали над оновленнями вони близько року. Нова гілка включає серію нових можливостей, а також кілька змін, які порушують сумісність. Розповідаємо детальніше, як оновилася ця популярна мова програмування.
Ключові покращення в PHP 8.1
Насамперед, додано підтримку перерахувань (enum), наприклад, замість класу з константами тепер можна використовувати таку конструкцію:
enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
Також додана підтримка легковагових потоків, які називаються файберами (Fiber) і які дають можливість керувати потоками виконання на низькому рівні. Файбери дозволяють визначати блоки коду, виконання яких може бути призупинено та поновлено за аналогією з генераторами, але з будь-якої позиції стека.
Безпосередньо файбери не забезпечують одночасне виконання потоків і вимагають визначення циклу обробки подій, але при цьому дають можливість використовувати один і той самий API в коді, який працює в блокувальному та розблокувальному режимі. Підтримку файберів планується додати у фреймворки Amphp та ReactPHP.
$fiber = новий Fiber(function (): void { $valueAfterResuming = Fiber::suspend('after suspending'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('after resuming');
Поліпшено реалізацію кешу об’єктного коду (opcache), в якій з’явилася можливість кешування інформації про спадкування класів. Оптимізація дозволила підняти продуктивність деяких програм на
З інших змін, що впливають на продуктивність, відзначається оптимізація роботи JIT, реалізація підтримки JIT для архітектури ARM64 (AArch64), прискорення вирішення імен класів, оптимізація бібліотек timelib і ext/date, підвищення продуктивності серіалізації та десеріалізації, оптимізація функцій get_declar ), strtr(), strnatcmp() та dechex(). Загалом відзначається підвищення продуктивності Symfony Demo на 23%, а WordPress на 3,5%.
Своєю чергою оператора розпакування всередині масивів «...$var», що дозволяє виконувати підстановку існуючих масивів щодо нового масиву, розширили підтримкою рядкових ключів (раніше підтримувалися лише цифрові ідентифікатори). Наприклад, тепер можна використовувати у коді:
$array1 = ["a" => 1]; $array2 = ["b" => 2]; $array = ["a" => 0, ...$array1, ...$array2]; var_dump($array); // ["a" => 1, "b" => 2]
Тепер дозволено використовувати ключове слово «new» в ініціалізаторах. Завдяки цьому можна використовувати об’єкти як значення параметрів за замовчуванням, статичні змінні, глобальні константи та аргументи атрибутів. Також можливе створення вкладених атрибутів.
class MyController { public function __construct( private Logger $logger = новий NullLogger(), ) {} }
До того ж надано можливість позначення властивостей класу для доступу тільки для читання (інформація в подібні властивості може бути записана лише один раз, після чого не буде доступною для зміни).
class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Other'; > Error: Cannot modify readonly property Post::$title
А ще реалізовано новий синтаксис для об’єктів, що викликаються (callable) — замикання тепер можна сформувати, викликавши функцію і передавши їй як аргумент значення «...» (тобто для отримання посилання на функцію можна використовувати myFunc(...) замість Closure: :fromCallable(’myFunc’)):
function foo(int $a, int $b) { /* … */ } $ foo = foo (...); $ foo (a: 1, b: 2);
Крім того, додано повноцінну підтримку перетинів типів (intersection types), що дозволяють створювати нові типи, значення яких повинні відповідати одночасно кільком типам. На відміну від union-типів, що визначають колекції з двох і більше типів, перетини потребують наявності в заповнювальній множині не будь-якого з перерахованих типів, а всіх зазначених типів.
function count_and_iterate(Iterator&Countable $value) { foreach ($value as $val) { echo $val; } count($value); }
Які ще зміни внесли
У новій версії PHP також з’явився новий тип «never», який можна використовувати для інформування статичних аналізаторів про те, що функція припиняє виконання програми, наприклад, викликаючи виключення або виконуючи функцію exit.
function dd(mixed $input): never { exit; }
Розробники запропонували нову функцію array_is_list, яка дозволяє визначити, що ключі в масиві розташовані в порядку збільшення числових значень, починаючи з 0:
$list = ["a", "b", "c"]; array_is_list($list); // true $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // false
Водночас для заборони перевизначення констант батьківського класу тепер можна використовувати ключове слово «final».
class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Fatal error: Bar::X cannot override final constant Foo::X }
Запропоновано функції fsync та fdatasync для примусового збереження змін із дискового кешу.
$file = fopen("sample.txt", "w"); fwrite($file, "Some content"); if (fsync($file)) { echo "File has been successfully persisted to disk."; } fclose($file);
Також додано можливість використання префіксів «0o» і «0O» для вісімкових чисел, крім префікса «0», який застосовувався раніше.
016 === 0o16; // true 016 === 0O16; // true
Віднині вибірково обмежено застосування $GLOBALS, що призведе до порушення зворотної сумісності, але дозволить значно прискорити операції з масивами. У тому числі заборонено запис у $GLOBALS та передача $GLOBALS за вказівником. Аналіз 2000 пакетів показав, що тільки 23 із них зазнають цієї зміни. Наприклад, припинено підтримку таких виразів, як:
$ GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
Тим часом розробники оголосили застарілими неявні несумісні перетворення чисел із плаваючою комою (float) у цілочисельне уявлення (int), що призводять до втрати точності. Наприклад, зміна застосовна при перетворенні значень ключів масивів, примусовому оголошенні цілочисельних чисел і в операторах, що працюють тільки з цілими числами.
$a = []; $a[15.5]; // deprecated, as key value loses the 0.5 component $a[15.0]; // ok, as 15.0 == 15
Що ще оновили
Називаємо також ще низку змін у новій версії мови PHP, на які варто звернути увагу:
- внутрішні методи тепер повинні повертати коректний тип. У PHP 8.1 при поверненні типу, що не відповідає оголошенню функції, з’являтимуться попередження, але в PHP 9.0 попередження хочуть замінити на помилку;
- продовжено роботу з переведення функцій із використання ресурсів на маніпуляцію об’єктами. На об’єкти переведені функції finfo_* та imap_*;
- оголошено застарілою передачу значень null як аргументів внутрішніх функцій, помічених як non-nullable. У PHP 8.1 використання конструкцій виду str_contains("string", null) буде призводити до попередження, а в PHP 9 — до помилки;
- оголошено застарілим програмний інтерфейс Serializable;
- у багатьох модулях ресурси перетворені в об’єкти (file_info -> finfo в FileInfo, FTPConnection, IMAPConnection, LDAPConnectionResult, PgSqlConnectionResult, PSpellDictionary, GdFont в GD тощо);
- додано підтримку алгоритмів хешування MurmurHash3 і xxHash.
Раніше повідомлялося, що спільнота розробників популярної мови програмування PHP заснувала нову некомерційну організацію PHP Foundation. Вона відповідатиме за організацію фінансування проєкту, підтримку спільноти та забезпечення процесу розробки.
Нагадаємо, мова програмування PHP посідає 5 місце в нашому ТОП-10 мов програмування в Україні,
Також можна ознайомитися з рейтингом мов програмування 2021 року за версією DOU.
30 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів