PHP 8.1 programozási nyelv kiadása

Egy év fejlesztés után bemutatták a PHP 8.1 programozási nyelv kiadását. Az új ág egy sor új szolgáltatást, valamint számos olyan változtatást tartalmaz, amelyek megszakítják a kompatibilitást.

Főbb fejlesztések a PHP 8.1-ben:

  • Hozzáadott támogatás a felsorolásokhoz, például most már a következő konstrukciókat használhatja: enum Status { case Pending; tok Aktív; ügy Archivált; } class Post { public function __construct( private Status $status = Állapot::Függőben; ) {} public function setStatus(Állapot $állapot): void { // … } } $post->setStatus(Status::Active);
  • Hozzáadott támogatás a Fibers nevű könnyű szálakhoz, amelyek lehetővé teszik a végrehajtási szálak alacsony szintű kezelését. A tervek szerint az Amphp és a ReactPHP keretrendszerhez szálas támogatást adnak. $fiber = new Fiber(függvény (): void { $valueAfterResuming = Fiber::suspend('felfüggesztés után'); // ... }); $valueAfterSuspending = $szál->start(); $fiber->resume('folytatás után');
  • Az objektumkód-gyorsítótár (opcache) megvalósítása továbbfejlesztett, lehetővé téve az osztályörökléssel kapcsolatos információk gyorsítótárazását. Az optimalizálás lehetővé tette egyes alkalmazások teljesítményének 5-8%-os növelését. Az egyéb optimalizálások közé tartozik a JIT működésének optimalizálása, az ARM64 architektúra JIT támogatásának megvalósítása (AArch64), a névfeloldás felgyorsítása, a timelib és ext/date könyvtárak optimalizálása, a megnövelt szerializálási és deszerializációs teljesítmény, a get_declared_classes(), explode() optimalizálása. , strtr() függvény, strnatcmp(), dechex(). Általánosságban elmondható, hogy a Symfony Demo teljesítménye 23.0%-kal, a WordPress esetében pedig 3.5%-kal nőtt.
  • A "...$var" tömbökön belüli kicsomagoló operátor, amely lehetővé teszi a meglévő tömbök helyettesítését új tömb meghatározásakor, kibővült a karakterlánc-kulcsok támogatására (korábban csak a digitális azonosítók voltak támogatottak). Például most használhatja a kódban: $tömb1 = ["a" => 1]; $tömb2 = ["b" => 2]; $tömb = ["a" => 0, …$tömb1, …$tömb2]; var_dump($tömb); // ["a" => 1, "b" => 2]
  • Az "új" kulcsszó használata megengedett az inicializálókban, például a függvénydefiníciókban alapértelmezett paraméterként vagy argumentum attribútumokban. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Lehetőség van osztálytulajdonságok megjelölésére írásvédett hozzáférésre (az ilyen tulajdonságokban lévő információ csak egyszer írható ki, utána nem lesz módosítható). class PostData { public function __construct( public readonly string $cím, publikus csak olvasható DateTimeImmutable $date, ) {} } $post = new Post('Cím', /* … */); $post->title = 'Egyéb'; > Hiba: A csak olvasható tulajdonság nem módosítható Post::$title
  • Új szintaxis került bevezetésre a hívható objektumokra – a lezárás létrehozható úgy, hogy meghívunk egy függvényt, és argumentumként a „...” értéket adjuk át neki (azaz myFunc(...) a Closure::fromCallable('myFunc) helyett ')): foo függvény (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • A kereszteződéstípusok teljes támogatása hozzáadva, lehetővé téve új típusok létrehozását a meglévők kombinálásával. Ellentétben az uniótípusokkal, amelyek két vagy több típusú gyűjteményt határoznak meg, a metszettípusokhoz nem a felsorolt ​​típusok egyikének, hanem az összes megadott típusnak a jelenléte szükséges a kitöltendő halmazban. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Létezik egy új "soha" típus, amellyel a statikus elemzőket tájékoztatni lehet arról, hogy egy függvény leállítja a program végrehajtását, például kivételt dobva vagy a kilépési függvény végrehajtásával. function dd(vegyes $bemenet): never { exit; }
  • Javasoltunk egy új tömb_is_list függvényt, amely lehetővé teszi annak meghatározását, hogy a tömbben lévő kulcsok növekvő számértékek szerint legyenek elrendezve, 0-tól kezdve: $list = ["a", "b", "c"]; array_is_list($lista); // igaz $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($isoNotAList); // hamis
  • Most már használhatja a "final" kulcsszót, hogy megakadályozza a szülőosztály-konstansok felülírását. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Végzetes hiba: Bar::X nem tudja felülírni a Foo::X végső állandót }
  • Az fsync és az fdatasync függvények a változtatások lemez-gyorsítótárból való mentésére kényszerülnek. $file = fopen("minta.txt", "w"); fwrite($file, "Néhány tartalom"); if (fsync($file)) { echo "A fájl sikeresen megmaradt a lemezen."; } fclose($file);
  • Hozzáadtuk a „0o” és „0O” előtagok használatát az oktális számokhoz, a korábban használt „0” előtag mellett. 016 === 0o16; // igaz 016 === 0O16; // igaz
  • Javasoljuk, hogy szelektíven korlátozzák a $GLOBALS használatát, ami a visszamenőleges kompatibilitás megsértéséhez vezet, de lehetővé teszi a tömbökkel végzett műveletek jelentős felgyorsítását. Például fontolóra veszi annak lehetőségét, hogy letiltsuk a $GLOBALS-ba való írást, és a $GLOBALS-t mutató segítségével továbbítsuk. 2000 csomag elemzése azt mutatta, hogy közülük csak 23-at érint ez a változás. Például, ha a javaslatot jóváhagyják, a 8.1 többé nem támogatja az olyan kifejezéseket, mint: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • A belső metódusoknak most a megfelelő típust kell visszaadniuk. A PHP 8.1-ben a függvénydeklarációnak nem megfelelő típus visszaadása figyelmeztetést ad, de a PHP 9.0-ban a figyelmeztetést hibával helyettesítjük.
  • Folytatódott a munka a funkcióknak az erőforrások használatától az objektumok manipulálásához való átvitelén. Az finfo_* és imap_* függvények átkerültek az objektumokhoz.
  • A null értékek argumentumként való átadása a nem nullázhatóvá jelölt belső függvényeknek elavult. A PHP 8.1-ben az str_contains("string", null) konstrukciók használata figyelmeztetéshez, a PHP 9-ben pedig hibához vezet.
  • Hozzáadott támogatás a MurmurHash3 és xxHash kivonatoló algoritmusokhoz.

Forrás: opennet.ru

Hozzászólás