Lansarea limbajului de programare PHP 8.1

După un an de dezvoltare, a fost prezentată lansarea limbajului de programare PHP 8.1. Noua ramură include o serie de caracteristici noi, precum și mai multe modificări care întrerup compatibilitatea.

Îmbunătățiri cheie în PHP 8.1:

  • S-a adăugat suport pentru enumerari, de exemplu, acum puteți utiliza următoarele constructe: enum Status { case Pending; caz Activ; caz Arhivat; } class Post { public function __construct( private Status $status = Stare::Pending; ) {} public function setStatus(Stare $status): void { // … } } $post->setStatus(Stare::Activ);
  • S-a adăugat suport pentru fire ușoare numite Fibre, care vă permit să gestionați firele de execuție la un nivel scăzut. Suportul pentru fibră este planificat să fie adăugat la cadrele Amphp și ReactPHP. $fibră = fibră nouă(funcție (): void { $valueAfterResuming = Fibră::suspend(‘după suspendare’); // … }); $valueAfterSuspending = $fibre->start(); $fibre->reluare(‘după reluare’);
  • Implementarea cache-ului de cod obiect (opcache) a fost îmbunătățită, făcând posibilă stocarea în cache a informațiilor despre moștenirea clasei. Optimizarea a făcut posibilă creșterea performanței unor aplicații cu 5-8%. Alte optimizări includ optimizarea operațiunii JIT, implementarea suportului JIT pentru arhitectura ARM64 (AArch64), accelerarea rezoluției numelor, optimizarea bibliotecilor timelib și ext/date, creșterea performanței de serializare și deserializare, optimizarea get_declared_classes(), explode() , funcția strtr(), strnatcmp(), dechex(). În general, există o creștere cu 23.0% a performanței pentru Symfony Demo și cu 3.5% pentru WordPress.
  • Operatorul de despachetare în interiorul matricelor „...$var”, care permite înlocuirea matricelor existente atunci când se definește o nouă matrice, a fost extins pentru a suporta chei șir (anterior erau acceptate doar identificatorii digitali). De exemplu, acum puteți utiliza în cod: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Este permisă utilizarea cuvântului cheie „nou” în inițializatoare, cum ar fi în definițiile funcțiilor ca parametru implicit sau în atributele argumentului. clasa MyController { function public __construct( private Logger $logger = new NullLogger(), ) {} }
  • Este posibil să se marcheze proprietățile clasei pentru acces numai în citire (informațiile din astfel de proprietăți pot fi scrise o singură dată, după care nu vor fi disponibile pentru modificare). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImutable $date, ) {} } $post = new Post(‘Titlu’, /* … */); $post->title = ‘Altele’; > Eroare: Nu se poate modifica proprietatea numai pentru citire Post::$title
  • O nouă sintaxă a fost implementată pentru obiectele apelabile - acum se poate forma o închidere apelând o funcție și trecându-i valoarea „...” ca argument (adică myFunc(...) în loc de Closure::fromCallable('myFunc). ')): funcția foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • S-a adăugat suport complet pentru tipurile de intersecție, permițându-vă să creați noi tipuri prin combinarea celor existente. Spre deosebire de tipurile de uniuni, care definesc colecții de două sau mai multe tipuri, tipurile de intersecție necesită prezența nu a niciunuia dintre tipurile enumerate, ci a tuturor tipurilor specificate din set pentru a fi completate. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Există un nou tip „niciodată” care poate fi folosit pentru a informa analizatorii statici că o funcție va încheia execuția programului, de exemplu prin lansarea unei excepții sau prin executarea funcției de ieșire. function dd(mixed $input): niciodata { exit; }
  • A fost propusă o nouă funcție array_is_list, care vă permite să determinați că cheile din matrice sunt aranjate în ordinea valorilor numerice crescătoare, începând de la 0: $list = [“a”, “b”, “c”]; array_is_list($listă); // adevărat $notAList = [1 => „a”, 2 => „b”, 3 => „c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // fals
  • Acum puteți utiliza cuvântul cheie „final” pentru a preveni înlocuirea constantelor clasei părinte. class Foo { final public const X = "foo"; } class Bar extinde Foo { public const X = "bar"; > Eroare fatală: Bar::X nu poate suprascrie constanta finală Foo::X }
  • Funcțiile fsync și fdatasync sunt propuse pentru a forța salvarea modificărilor din memoria cache a discului. $fisier = fopen("sample.txt", "w"); fwrite($fișier, „Un conținut”); if (fsync($fișier)) { echo „Fișierul a fost păstrat cu succes pe disc.”; } fclose($fișier);
  • S-a adăugat posibilitatea de a folosi prefixele „0o” și „0O” pentru numere octale, în plus față de prefixul „0” folosit anterior. 016 === 0o16; // adevărat 016 === 0O16; // Adevărat
  • Se propune limitarea selectivă a utilizării $GLOBALS, ceea ce va duce la o încălcare a compatibilității cu înapoi, dar va face posibilă accelerarea semnificativă a operațiunilor cu matrice. De exemplu, se ia în considerare posibilitatea de a dezactiva scrierea în $GLOBALS și de a trece $GLOBALS prin pointer. O analiză a 2000 de pachete a arătat că doar 23 dintre ele ar fi afectate de această modificare. De exemplu, dacă propunerea este aprobată, 8.1 nu va mai suporta expresii precum: $GLOBALS = []; $GLOBALE += []; $GLOBALS =& $x; $x =& $GLOBAL; unset($GLOBALS); by_ref($GLOBALS);
  • Metodele interne ar trebui să returneze acum tipul corect. În PHP 8.1, returnarea unui tip care nu se potrivește cu declarația funcției va produce un avertisment, dar în PHP 9.0 avertismentul va fi înlocuit cu o eroare.
  • Au continuat lucrările de transfer de funcții de la utilizarea resurselor la manipularea obiectelor. Funcțiile finfo_* și imap_* au fost transferate la obiecte.
  • Transmiterea valorilor nule ca argumente la funcțiile interne marcate ca non-nullable a fost retrasă. În PHP 8.1, utilizarea constructelor precum str_contains(„string”, null) va duce la un avertisment, iar în PHP 9 la o eroare.
  • S-a adăugat suport pentru algoritmii de hashing MurmurHash3 și xxHash.

Sursa: opennet.ru

Adauga un comentariu