Vrijgave programmeertaal PHP 8.1

Na een jaar van ontwikkeling werd de release van de programmeertaal PHP 8.1 gepresenteerd. De nieuwe tak bevat een reeks nieuwe functies, evenals verschillende wijzigingen die de compatibiliteit verbreken.

Belangrijkste verbeteringen in PHP 8.1:

  • Er is ondersteuning toegevoegd voor opsommingen. U kunt nu bijvoorbeeld de volgende constructies gebruiken: enum Status { case Pending; geval Actief; zaak Gearchiveerd; } class Post { publieke functie __construct( private Status $status = Status::Pending; ) {} publieke functie setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Ondersteuning toegevoegd voor lichtgewicht threads genaamd Fibers, waarmee u uitvoeringsthreads op een laag niveau kunt beheren. Het is de bedoeling dat glasvezelondersteuning wordt toegevoegd aan de Amphp- en ReactPHP-frameworks. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('na opschorten'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->cv('na hervatten');
  • De implementatie van de objectcodecache (opcache) is verbeterd, waardoor het mogelijk wordt om informatie over klassenovererving in de cache op te slaan. Optimalisatie maakte het mogelijk om de prestaties van sommige applicaties met 5-8% te verbeteren. Andere optimalisaties omvatten optimalisatie van JIT-werking, implementatie van JIT-ondersteuning voor de ARM64-architectuur (AArch64), versnelling van naamresolutie, optimalisatie van timelib- en ext/date-bibliotheken, verbeterde serialisatie- en deserialisatieprestaties, optimalisatie van de get_declared_classes(), explode() , strtr() functie, strnatcmp(), dechex(). Over het algemeen is er een prestatieverbetering van 23.0% voor Symfony Demo en 3.5% voor WordPress.
  • De uitpakoperator binnen arrays "...$var", die vervanging van bestaande arrays mogelijk maakt bij het definiëren van een nieuwe array, is uitgebreid om tekenreekssleutels te ondersteunen (voorheen werden alleen digitale identificatiegegevens ondersteund). U kunt nu bijvoorbeeld in code gebruiken: $array1 = [“a” => 1]; $matrix2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Het is toegestaan ​​om het trefwoord "new" te gebruiken in initializers, zoals in functiedefinities als standaardparameter of in argumentattributen. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Het is mogelijk om klasse-eigenschappen te markeren voor alleen-lezen toegang (informatie in dergelijke eigenschappen kan slechts één keer worden geschreven, waarna deze niet meer kan worden gewijzigd). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Anders'; > Fout: kan de alleen-lezen eigenschap Post::$title niet wijzigen
  • Er is een nieuwe syntaxis geïmplementeerd voor opvraagbare objecten - een afsluiting kan nu worden gevormd door een functie aan te roepen en deze de waarde "..." door te geven als argument (d.w.z. myFunc(...) in plaats van Closure::fromCallable('myFunc ')): functie foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Volledige ondersteuning toegevoegd voor kruispunttypen, zodat u nieuwe typen kunt maken door bestaande te combineren. In tegenstelling tot samenvoegingstypen, die verzamelingen van twee of meer typen definiëren, vereisen intersectietypen de aanwezigheid van niet een van de opgesomde typen, maar alle gespecificeerde typen in de set die moeten worden gevuld. function genererenSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Er is een nieuw type "nooit" dat kan worden gebruikt om statische analysatoren te informeren dat een functie de uitvoering van het programma zal beëindigen, bijvoorbeeld door een uitzondering te genereren of de exit-functie uit te voeren. functie dd(gemengde $invoer): nooit { exit; }
  • Er is een nieuwe functie array_is_list voorgesteld, waarmee u kunt bepalen dat de sleutels in de array zijn gerangschikt in volgorde van toenemende numerieke waarden, beginnend bij 0: $list = [“a”, “b”, “c”]; array_is_list($lijst); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $ookNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($ookNotAList); // vals
  • U kunt nu het trefwoord "final" gebruiken om te voorkomen dat constanten van bovenliggende klassen worden overschreven. klasse Foo {laatste openbare const X = "foo"; } class Bar breidt Foo uit { public const X = "bar"; > Fatale fout: Bar::X kan de uiteindelijke constante Foo::X niet overschrijven }
  • De functies fsync en fdatasync worden voorgesteld om te forceren dat wijzigingen worden opgeslagen vanuit de schijfcache. $file = fopen("voorbeeld.txt", "w"); fwrite($file, "Sommige inhoud"); if (fsync($file)) { echo "Het bestand is met succes op schijf opgeslagen."; } fclose($bestand);
  • De mogelijkheid toegevoegd om de voorvoegsels "0o" en "0O" te gebruiken voor octale getallen, naast het eerder gebruikte voorvoegsel "0". 016 === 0o16; // waar 016 === 0O16; // WAAR
  • Er wordt voorgesteld om het gebruik van $GLOBALS selectief te beperken, wat zal leiden tot een schending van de achterwaartse compatibiliteit, maar het mogelijk zal maken om de bewerkingen met arrays aanzienlijk te versnellen. Er wordt bijvoorbeeld nagedacht over de mogelijkheid om het schrijven naar $GLOBALS en het doorgeven van $GLOBALS per pointer uit te schakelen. Uit een analyse van 2000 pakketten bleek dat slechts 23 van hen door deze verandering zouden worden getroffen. Als het voorstel bijvoorbeeld wordt goedgekeurd, ondersteunt 8.1 niet langer uitdrukkingen zoals: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; niet ingesteld($GLOBALS); by_ref($GLOBALS);
  • Interne methoden zouden nu het juiste type moeten retourneren. In PHP 8.1 zal het retourneren van een type dat niet overeenkomt met de functiedeclaratie een waarschuwing opleveren, maar in PHP 9.0 zal de waarschuwing worden vervangen door een fout.
  • Er werd verder gewerkt aan het overbrengen van functies van het gebruik van hulpbronnen naar het manipuleren van objecten. De functies finfo_* en imap_* zijn overgebracht naar objecten.
  • Het doorgeven van null-waarden als argumenten aan interne functies die zijn gemarkeerd als niet-nullable, is verouderd. In PHP 8.1 zal het gebruik van constructies als str_contains("string", null) leiden tot een waarschuwing, en in PHP 9 tot een fout.
  • Ondersteuning toegevoegd voor hash-algoritmen MurmurHash3 en xxHash.

Bron: opennet.ru

Voeg een reactie