Izdanje programskog jezika PHP 8.1

Nakon godinu dana razvoja, predstavljeno je izdanje programskog jezika PHP 8.1. Nova grana uključuje niz novih značajki, kao i nekoliko promjena koje prekidaju kompatibilnost.

Ključna poboljšanja u PHP 8.1:

  • Dodana podrška za enumeracije, na primjer, sada možete koristiti sljedeće konstrukcije: enum Status { case Pending; case Active; slučaj Arhivirano; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Dodana je podrška za lagane niti koje se nazivaju Vlakna, a koje vam omogućuju upravljanje izvršnim nitima na niskoj razini. Podrška za vlakna planira se dodati okvirima Amphp i ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘nakon obustave’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('nakon nastavka');
  • Implementacija predmemorije objektnog koda (opcache) je poboljšana, što omogućuje spremanje u predmemoriju informacija o nasljeđivanju klasa. Optimizacija je omogućila povećanje performansi nekih aplikacija za 5-8%. Ostale optimizacije uključuju optimizaciju rada JIT-a, implementaciju JIT podrške za arhitekturu ARM64 (AArch64), ubrzanje razlučivanja imena, optimizaciju knjižnica timelib i ext/date, povećane performanse serijalizacije i deserijalizacije, optimizaciju get_declared_classes(), explode() , funkcija strtr(), strnatcmp(), dechex(). Općenito, postoji povećanje performansi od 23.0% za Symfony Demo i 3.5% za WordPress.
  • Operator za raspakiranje unutar nizova "...$var", koji omogućuje zamjenu postojećih nizova prilikom definiranja novog niza, proširen je tako da podržava ključeve nizova (ranije su bili podržani samo digitalni identifikatori). Na primjer, sada možete koristiti u kodu: $array1 = [“a” => 1]; $niz2 = ["b" => 2]; $niz = [“a” => 0, …$niz1, …$niz2]; var_dump($niz); // ["a" => 1, "b" => 2]
  • Dopušteno je koristiti ključnu riječ "new" u inicijalizatorima, kao što su definicije funkcija kao zadani parametar ili u atributima argumenata. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Moguće je označiti svojstva klase za pristup samo za čitanje (informacije u takvim svojstvima mogu se napisati samo jednom, nakon čega neće biti dostupne za promjenu). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Ostalo'; > Pogreška: Nije moguće promijeniti svojstvo samo za čitanje Post::$title
  • Implementirana je nova sintaksa za objekte koji se mogu pozivati ​​- zatvaranje se sada može formirati pozivanjem funkcije i prosljeđivanjem vrijednosti "..." kao argumenta (tj. myFunc(...) umjesto Closure::fromCallable('myFunc ')): funkcija foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Dodana puna podrška za vrste raskrižja, što vam omogućuje stvaranje novih vrsta kombiniranjem postojećih. Za razliku od tipova unije, koji definiraju zbirke od dva ili više tipova, tipovi presjeka zahtijevaju prisutnost ne bilo kojeg od navedenih tipova, već svih navedenih tipova u skupu koji treba ispuniti. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Postoji novi tip "nikad" koji se može koristiti za obavještavanje statičkih analizatora da će funkcija prekinuti izvršenje programa, na primjer bacanjem iznimke ili izvršavanjem izlazne funkcije. funkcija dd(mješoviti $input): nikad { izlaz; }
  • Predložena je nova funkcija array_is_list koja vam omogućuje da odredite da su ključevi u nizu raspoređeni prema rastućim brojčanim vrijednostima, počevši od 0: $list = [“a”, “b”, “c”]; niz_je_popis($popis); // istina $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; niz_je_popis($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // lažno
  • Sada možete koristiti ključnu riječ "final" kako biste spriječili nadjačavanje konstanti nadređene klase. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Fatalna pogreška: Bar::X ne može nadjačati konačnu konstantu Foo::X }
  • Predložene su funkcije fsync i fdatasync za prisilno spremanje promjena iz predmemorije diska. $file = fopen("uzorak.txt", "w"); fwrite($file, "Neki sadržaj"); if (fsync($file)) { echo "Datoteka je uspješno zadržana na disku."; } fclose($datoteka);
  • Dodana je mogućnost korištenja prefiksa "0o" i "0O" za oktalne brojeve, uz prethodno korišteni prefiks "0". 016 === 0o16; // istina 016 === 0O16; // istina
  • Predlaže se selektivno ograničiti korištenje $GLOBALS, što će dovesti do kršenja kompatibilnosti s prethodnim verzijama, ali će omogućiti značajno ubrzanje operacija s nizovima. Na primjer, razmatra se mogućnost onemogućavanja pisanja u $GLOBALS i prosljeđivanja $GLOBALS pomoću pokazivača. Analiza 2000 paketa pokazala je da će samo njih 23 biti pogođene ovom promjenom. Na primjer, ako je prijedlog odobren, 8.1 više neće podržavati izraze kao što su: $GLOBALS = []; $GLOBALI += []; $GLOBALS =& $x; $x =& $GLOBALI; poništi($GLOBALS); by_ref($GLOBALS);
  • Interne metode sada bi trebale vratiti ispravnu vrstu. U PHP 8.1 vraćanje tipa koji ne odgovara deklaraciji funkcije proizvest će upozorenje, ali u PHP 9.0 upozorenje će biti zamijenjeno pogreškom.
  • Nastavljen je rad na prijenosu funkcija s korištenja resursa na manipuliranje objektima. Funkcije finfo_* i imap_* prenesene su na objekte.
  • Prosljeđivanje null vrijednosti kao argumenata internim funkcijama koje su označene kao nenullable je zastarjelo. U PHP-u 8.1 korištenje konstrukcija poput str_contains("string", null) dovest će do upozorenja, a u PHP-u 9 do pogreške.
  • Dodana podrška za MurmurHash3 i xxHash algoritme raspršivanja.

Izvor: opennet.ru

Dodajte komentar