Пасля года распрацоўкі прадстаўлены рэліз мовы праграмавання 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