Frigivelse af programmeringssproget PHP 8.1

Efter et års udvikling blev udgivelsen af ​​programmeringssproget PHP 8.1 præsenteret. Den nye filial indeholder en række nye funktioner samt adskillige ændringer, der bryder kompatibiliteten.

Vigtigste forbedringer i PHP 8.1:

  • Tilføjet understøttelse af opregninger, for eksempel, kan du nu bruge følgende konstruktioner: enum Status { case Pending; etui Aktiv; sag Arkiveret; } class Post { public function __construct( privat Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Tilføjet understøttelse af letvægtstråde kaldet Fibres, som giver dig mulighed for at administrere udførelsestråde på et lavt niveau. Fiberunderstøttelse er planlagt til at blive tilføjet til Amphp- og ReactPHP-rammerne. $fiber = new Fiber(funktion (): void { $valueAfterResuming = Fiber::suspend('efter suspendering'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('efter genoptagelse');
  • Implementeringen af ​​objektkodecachen (opcache) er blevet forbedret, hvilket gør det muligt at cache information om klassearv. Optimering gjorde det muligt at øge ydeevnen af ​​nogle applikationer med 5-8 %. Andre optimeringer omfatter optimering af JIT-drift, implementering af JIT-understøttelse til ARM64-arkitekturen (AArch64), acceleration af navneopløsning, optimering af timelib og ext/date-biblioteker, øget serialiserings- og deserialiseringsydelse, optimering af get_declared_classes(), explode() , strtr() funktion, strnatcmp(), dechex(). Generelt er der en stigning på 23.0 % i ydeevnen for Symfony Demo, og 3.5 % for WordPress.
  • Udpakningsoperatøren inde i arrays "...$var", som tillader substitution af eksisterende arrays, når der defineres et nyt array, er blevet udvidet til at understøtte strengnøgler (tidligere blev kun digitale identifikatorer understøttet). For eksempel kan du nu bruge i kode: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Det er tilladt at bruge det "nye" nøgleord i initialiseringsprogrammer, såsom i funktionsdefinitioner som en standardparameter eller i argumentattributter. klasse MyController { public function __construct( privat Logger $logger = new NullLogger(), ) {} }
  • Det er muligt at markere klasseegenskaber for skrivebeskyttet adgang (information i sådanne egenskaber kan kun skrives én gang, hvorefter den ikke vil være tilgængelig for ændring). class PostData { public function __construct( offentlig skrivebeskyttet streng $titel, offentlig skrivebeskyttet DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Andet'; > Fejl: Kan ikke ændre skrivebeskyttet egenskab Post::$title
  • En ny syntaks er blevet implementeret for kaldbare objekter - en lukning kan nu dannes ved at kalde en funktion og give den værdien "..." som et argument (dvs. myFunc(...) i stedet for Closure::fromCallable('myFunc ')): funktion foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Tilføjet fuld understøttelse af krydstyper, så du kan oprette nye typer ved at kombinere eksisterende. I modsætning til fagforeningstyper, som definerer samlinger af to eller flere typer, kræver skæringstyper tilstedeværelsen af ​​ikke nogen af ​​de anførte typer, men alle de specificerede typer i sættet, der skal udfyldes. funktion generereSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Der er en ny type "aldrig", der kan bruges til at informere statiske analysatorer om, at en funktion vil afslutte programafviklingen, for eksempel ved at kaste en undtagelse eller udføre exitfunktionen. funktion dd(blandet $input): aldrig { exit; }
  • En ny funktion array_is_list er blevet foreslået, som giver dig mulighed for at bestemme, at nøglerne i arrayet er arrangeret i rækkefølge efter stigende numeriske værdier, startende fra 0: $list = ["a", "b", "c"]; array_is_list($liste); // true $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // falsk
  • Du kan nu bruge nøgleordet "endelige" til at forhindre overordnede klassekonstanter i at blive tilsidesat. klasse Foo { final public const X = "foo"; } klasse Bar udvider Foo { public const X = "bar"; > Fatal fejl: Bar::X kan ikke tilsidesætte slutkonstanten Foo::X }
  • Funktionerne fsync og fdatasync foreslås for at tvinge ændringer til at blive gemt fra diskcachen. $fil = fopen("sample.txt", "w"); fwrite($fil, "Noget indhold"); if (fsync($fil)) { echo "Filen er blevet overført til disken."; } fclose($fil);
  • Tilføjet muligheden for at bruge præfikserne "0o" og "0O" til oktale tal, foruden det tidligere brugte præfiks "0". 016 === 0o16; // sand 016 === 0O16; // rigtigt
  • Det foreslås selektivt at begrænse brugen af ​​$GLOBALS, hvilket vil føre til en krænkelse af bagudkompatibilitet, men vil gøre det muligt at fremskynde operationer med arrays betydeligt. For eksempel overvejes muligheden for at deaktivere skrivning til $GLOBALS og sende $GLOBALS med pointer. En analyse af 2000 pakker viste, at kun 23 af dem ville blive berørt af denne ændring. Hvis forslaget f.eks. godkendes, vil 8.1 ikke længere understøtte udtryk som: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Interne metoder skulle nu returnere den korrekte type. I PHP 8.1 vil returnering af en type, der ikke matcher funktionsdeklarationen, give en advarsel, men i PHP 9.0 vil advarslen blive erstattet med en fejl.
  • Arbejdet fortsatte med at overføre funktioner fra at bruge ressourcer til at manipulere objekter. Funktionerne finfo_* og imap_* er blevet overført til objekter.
  • At videregive null-værdier som argumenter til interne funktioner, der er markeret som ikke-nullable, er blevet forældet. I PHP 8.1 vil brug af konstruktioner som str_contains("string", null) føre til en advarsel, og i PHP 9 til en fejl.
  • Tilføjet understøttelse af MurmurHash3 og xxHash hashing algoritmer.

Kilde: opennet.ru

Tilføj en kommentar