Рэліз мовы праграмавання 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"; > Памяншэнне 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

Дадаць каментар