Izdaja programskega jezika PHP 8.1

Po letu dni razvoja je bila predstavljena izdaja programskega jezika PHP 8.1. Nova veja vključuje vrsto novih funkcij, pa tudi več sprememb, ki motijo ​​združljivost.

Ključne izboljšave v PHP 8.1:

  • Dodana podpora za naštevanja, na primer zdaj lahko uporabite naslednje konstrukte: enum Status { case Pending; case Active; zadeva Arhivirano; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Dodana podpora za lahke niti, imenovane Fibers, ki vam omogočajo upravljanje izvajalnih niti na nizki ravni. Podpora za vlakna naj bi bila dodana okviroma Amphp in ReactPHP. $fiber = novo Fiber(funkcija (): void { $valueAfterResuming = Fiber::suspend('po prekinitvi'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('po nadaljevanju');
  • Implementacija predpomnilnika objektne kode (opcache) je bila izboljšana, kar omogoča shranjevanje informacij o dedovanju razredov. Optimizacija je omogočila povečanje zmogljivosti nekaterih aplikacij za 5-8%. Druge optimizacije vključujejo optimizacijo delovanja JIT, implementacijo podpore JIT za arhitekturo ARM64 (AArch64), pospešitev ločljivosti imen, optimizacijo knjižnic timelib in ext/date, povečano zmogljivost serializacije in deserializacije, optimizacijo get_declared_classes(), explode() , funkcija strtr(), strnatcmp(), dechex(). Na splošno se zmogljivost Symfony Demo poveča za 23.0 %, WordPress pa za 3.5 %.
  • Operator razpakiranja znotraj matrik "...$var", ki omogoča zamenjavo obstoječih matrik pri definiranju nove matrike, je bil razširjen tako, da podpira nizovne ključe (prej so bili podprti le digitalni identifikatorji). Na primer, zdaj lahko uporabite v kodi: $array1 = [“a” => 1]; $matrika2 = ["b" => 2]; $matrika = ["a" => 0, …$matrika1, …$matrika2]; var_dump($matrika); // ["a" => 1, "b" => 2]
  • Dovoljena je uporaba ključne besede "novo" v inicializatorjih, na primer v definicijah funkcij kot privzeti parameter ali v atributih argumentov. class MyController { javna funkcija __construct( private Logger $logger = new NullLogger(), ) {} }
  • Možno je označiti lastnosti razreda za dostop samo za branje (informacije v take lastnosti se lahko zapišejo le enkrat, potem pa ne bodo več na voljo za spreminjanje). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Drugo'; > Napaka: lastnosti samo za branje ni mogoče spremeniti Post::$title
  • Implementirana je nova sintaksa za objekte, ki jih je mogoče priklicati - zaprtje je zdaj mogoče oblikovati tako, da pokličete funkcijo in ji posredujete vrednost "..." kot argument (tj. myFunc(...) namesto Closure::fromCallable('myFunc ')): funkcija foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Dodana je popolna podpora za vrste križišč, kar vam omogoča ustvarjanje novih vrst s kombiniranjem obstoječih. Za razliko od tipov unije, ki definirajo zbirke dveh ali več tipov, tipi presečišč ne zahtevajo prisotnosti katerega koli od navedenih tipov, ampak vseh navedenih tipov v nizu, ki ga je treba zapolniti. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Obstaja nov tip »nikoli«, ki ga je mogoče uporabiti za obveščanje statičnih analizatorjev, da bo funkcija prekinila izvajanje programa, na primer tako, da vrže izjemo ali izvede izhodno funkcijo. funkcija dd(mešani $input): nikoli { izhod; }
  • Predlagana je bila nova funkcija array_is_list, ki vam omogoča, da ugotovite, da so ključi v matriki razporejeni po naraščajočih številskih vrednostih, začenši z 0: $list = [“a”, “b”, “c”]; array_is_list($list); // resnično $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // napačno
  • Zdaj lahko uporabite ključno besedo "final", da preprečite preglasitev konstant nadrejenega razreda. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Usodna napaka: Bar::X ne more preglasiti končne konstante Foo::X }
  • Funkciji fsync in fdatasync sta predlagani za prisilno shranjevanje sprememb iz predpomnilnika diska. $file = fopen("sample.txt", "w"); fwrite($file, "Nekaj ​​vsebine"); if (fsync($file)) { echo "Datoteka je bila uspešno shranjena na disku."; } fclose($file);
  • Dodana možnost uporabe predpon "0o" in "0O" za osmiška števila, poleg prej uporabljene predpone "0". 016 === 0o16; // res 016 === 0O16; // prav
  • Predlaga se selektivno omejitev uporabe $GLOBALS, kar bo povzročilo kršitev združljivosti za nazaj, vendar bo omogočilo znatno pospešitev operacij z nizi. Na primer, obravnava se možnost onemogočanja pisanja v $GLOBALS in posredovanja $GLOBALS s kazalcem. Analiza 2000 paketov je pokazala, da bo ta sprememba vplivala le na 23 paketov. Na primer, če je predlog odobren, 8.1 ne bo več podpiral izrazov, kot so: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Notranje metode bi morale zdaj vrniti pravilno vrsto. V PHP 8.1 bo vrnitev vrste, ki se ne ujema z deklaracijo funkcije, povzročila opozorilo, v PHP 9.0 pa bo opozorilo zamenjano z napako.
  • Nadaljevalo se je delo pri prenosu funkcij z uporabe virov na manipulacijo objektov. Funkciji finfo_* in imap_* sta bili preneseni na objekte.
  • Posredovanje ničelnih vrednosti kot argumentov notranjim funkcijam, označenim kot nenullable, je bilo zastarelo. V PHP 8.1 bo uporaba konstruktov, kot je str_contains("string", null), vodila do opozorila, v PHP 9 pa do napake.
  • Dodana podpora za algoritma zgoščevanja MurmurHash3 in xxHash.

Vir: opennet.ru

Dodaj komentar