Izdanje PHP 8.1 programskog jezika

Nakon godinu dana razvoja, predstavljeno je izdanje programskog jezika PHP 8.1. Nova grana uključuje niz novih funkcija, kao i nekoliko promjena koje narušavaju kompatibilnost.

Ključna poboljšanja u PHP 8.1:

  • Dodata podrška za enumeracije, na primjer, sada možete koristiti sljedeće konstrukcije: enum Status { case Pending; case Active; case Archived; } class Post { javna funkcija __construct( private Status $status = Status::Pending; ) {} javna funkcija setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Dodata podrška za lagane niti zvane Fibers, koje vam omogućavaju da upravljate nitima izvršenja na niskom nivou. Planirano je da se podrška za vlakna doda Amphp i ReactPHP okvirima. $fiber = novo vlakno(funkcija (): void { $valueAfterResuming = Fiber::suspend('nakon suspendovanja'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('nakon nastavka');
  • Implementacija predmemorije objektnog koda (opcache) je poboljšana, što omogućava keširanje informacija o nasljeđivanju klasa. Optimizacija je omogućila povećanje performansi nekih aplikacija za 5-8%. Ostale optimizacije uključuju optimizaciju JIT rada, implementaciju JIT podrške za ARM64 arhitekturu (AArch64), ubrzanje rezolucije imena, optimizaciju timelib i ext/date biblioteka, povećane performanse serijalizacije i deserializacije, optimizaciju get_declared_classes(), explode() , strtr() funkcija, strnatcmp(), dechex(). Općenito, postoji povećanje performansi za 23.0% za Symfony Demo i 3.5% za WordPress.
  • Operator za raspakivanje unutar nizova "...$var", koji dozvoljava zamjenu postojećih nizova prilikom definiranja novog niza, proširen je tako da podržava string ključeve (ranije su bili podržani samo digitalni identifikatori). Na primjer, sada možete koristiti u kodu: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Dozvoljeno je koristiti ključnu riječ "new" u inicijalizatorima, kao što su definicije funkcija kao zadani parametar ili u atributima argumenta. class MyController { javna funkcija __construct( privatni Logger $logger = novi NullLogger(), ) {} }
  • Moguće je označiti svojstva klase za pristup samo za čitanje (informacije u takvim svojstvima mogu se upisati samo jednom, nakon čega neće biti dostupne za promjenu). class PostData { public function __construct (javni string samo za čitanje $title, javni samo za čitanje DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Ostalo'; > Greška: Ne mogu modificirati 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);
  • Dodata je puna podrška za tipove raskrsnica, što vam omogućava da kreirate nove tipove kombinovanjem postojećih. Za razliku od tipova unije, koji definiraju kolekcije od dva ili više tipova, tipovi ukrštanja zahtijevaju prisustvo ne jednog od navedenih tipova, već svih navedenih tipova u skupu koji treba popuniti. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Postoji novi tip "nikad" koji se može koristiti za informiranje statičkih analizatora da će funkcija prekinuti izvršavanje programa, na primjer izbacivanjem izuzetka ili izvršavanjem izlazne funkcije. funkcija dd(mješoviti $input): nikad { exit; }
  • Predložena je nova funkcija array_is_list, koja vam omogućava 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”]; array_is_list($list); // tačno $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // false
  • Sada možete koristiti ključnu riječ "final" da spriječite nadjačavanje konstanti roditeljske klase. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Fatalna greška: Bar::X ne može nadjačati konačnu konstantu Foo::X }
  • Funkcije fsync i fdatasync su predložene da prisilno spremaju promjene iz predmemorije diska. $file = fopen("sample.txt", "w"); fwrite($file, "Neki sadržaj"); if (fsync($file)) { echo "Datoteka je uspješno sačuvana na disku."; } fclose($file);
  • Dodata mogućnost korištenja prefiksa "0o" i "0O" za oktalne brojeve, pored prethodno korištenog prefiksa "0". 016 === 0o16; // istina 016 === 0O16; // istinito
  • Predlaže se da se selektivno ograniči korištenje $GLOBALS-a, što će dovesti do kršenja kompatibilnosti unatrag, 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 pokazivačem. Analiza 2000 paketa pokazala je da će samo 23 od njih biti pogođeno ovom promjenom. Na primjer, ako je prijedlog odobren, 8.1 više neće podržavati izraze kao što su: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Interne metode bi sada trebale vratiti ispravan tip. U PHP-u 8.1, vraćanje tipa koji ne odgovara deklaraciji funkcije će proizvesti upozorenje, ali u PHP-u 9.0 upozorenje će biti zamijenjeno greškom.
  • Nastavljen je rad na prijenosu funkcija s korištenja resursa na manipulaciju objektima. Funkcije finfo_* i imap_* prebačene su na objekte.
  • Prosljeđivanje null vrijednosti kao argumenata internim funkcijama označenim kao nenullable je zastarjelo. U PHP-u 8.1, korišćenje konstrukcija kao što je str_contains("string", null) će dovesti do upozorenja, a u PHP-u 9 do greške.
  • Dodata podrška za MurmurHash3 i xxHash algoritme heširanja.

izvor: opennet.ru

Dodajte komentar