Реліз мови програмування PHP 8.1

Після року розробки реліз мови програмування PHP 8.1. Нова гілка включає серію нових можливостей, а також кілька змін, що порушують сумісність.

Ключові покращення в PHP 8.1:

  • Додано підтримку перерахувань, наприклад, тепер можна використовувати такі конструкції: 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) і дозволяють управляти потоками виконання на низькому рівні. Підтримку файберів планується додати у фреймворки Amphp та ReactPHP. $fiber = new Fiber(function(): void { $valueAfterResuming = Fiber::suspend('after suspending'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('after resuming');
  • Поліпшено реалізацію кешу об'єктного коду (opcache), в якій з'явилася можливість кешування інформації про спадкування класів. Оптимізація дозволила підняти продуктивність деяких програм на 5-8%. З інших оптимізацій відзначається оптимізація роботи JIT, реалізація підтримки JIT для архітектури ARM64 (AArch64), прискорення дозволу імен, оптимізація бібліотек timelib та ext/date, підвищення продуктивності серіалізації та десеріалізації, оптимізація функція get_declared_classes(), strnatcmp(), dechex(). Загалом відзначається підвищення продуктивності Symfony Demo на 23.0%, а 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 = new 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-типів, визначальних колекції з двох і більше типів, intersection-типи вимагають наявності в множині, що заповнюється, не будь-якого з перерахованих типів, а всіх зазначених типів. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • З'явився новий тип «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 з них торкнеться цієї зміни. Наприклад, у разі схвалення пропозиції у 8.1 буде припинено підтримку таких виразів, як: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Внутрішні методи повинні повертати коректний тип. У PHP 8.1 при поверненні типу, що не відповідає оголошення функції, будуть виводитися попередження, але в PHP 9.0 попередження буде замінено на помилку.
  • Продовжено роботу з переведення функцій з використання ресурсів на маніпуляцію об'єктами. На об'єкти переведені функції finfo_* та imap_*.
  • Оголошено застарілою передачу значень null як аргументи внутрішніх функцій, позначені як non-nullable. У PHP 8.1 використання конструкцій виду str_contains(«string», null) буде призводити до попередження, а PHP 9 до помилки.
  • Додано підтримку алгоритмів хешування MurmurHash3 і xxHash.

Джерело: opennet.ru

Додати коментар або відгук