PHP 8.1 programmeerimiskeele väljalase

Pärast aastast arendustööd esitleti PHP 8.1 programmeerimiskeele väljalaset. Uus haru sisaldab mitmeid uusi funktsioone, aga ka mitmeid muudatusi, mis rikuvad ühilduvust.

PHP 8.1 peamised täiustused:

  • Lisatud on näiteks loenduste tugi, nüüd saate kasutada järgmisi konstruktsioone: enum Status { case Pending; juhtum Aktiivne; juhtum Arhiveeritud; } class Postitus { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Olek $olek): void { // … } } $post->setStatus(Olek::Aktiivne);
  • Lisatud tugi kergetele lõimedele, mida nimetatakse Fibersiks, mis võimaldab teil hallata täitmislõime madalal tasemel. Fiber tugi on plaanis lisada Amphp ja ReactPHP raamistikele. $fiber = new Fiber(funktsioon (): void { $valueAfterResuming = Fiber::suspend('pärast peatamist'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('pärast jätkamist');
  • Objekti koodi vahemälu (opcache) rakendamist on täiustatud, mis võimaldab vahemällu salvestada teavet klasside pärimise kohta. Optimeerimine võimaldas tõsta mõne rakenduse jõudlust 5-8%. Muud optimeerimised hõlmavad JIT-i toimimise optimeerimist, JIT-i toe rakendamist ARM64 arhitektuurile (AArch64), nimede eraldusvõime kiirendamist, timelib- ja ext/date-teekide optimeerimist, serialiseerimise ja deserialiseerimise jõudluse suurendamist, get_declared_classes(), explode()-i optimeerimist. , funktsioon strtr(), strnatcmp(), dechex(). Üldiselt on Symfony Demo jõudlus kasvanud 23.0% ja WordPressi puhul 3.5%.
  • Lahtipakkimisoperaator massiivides "...$var", mis võimaldab uue massiivi defineerimisel olemasolevaid massiive asendada, on laiendatud stringivõtmete toetamiseks (varem toetati ainult digitaalseid identifikaatoreid). Näiteks saate nüüd koodis kasutada: $massiiv1 = ["a" => 1]; $massiv2 = ["b" => 2]; $massiivi = ["a" => 0, …$massiivi1, …$massiivi2]; var_dump($massiiv); // ["a" => 1, "b" => 2]
  • Märksõna "uus" on lubatud kasutada initsialisaatorites, näiteks funktsioonide definitsioonides vaikeparameetrina või argumendiatribuutides. class MyController { public function __construct( private logger $logger = new NullLogger(), ) {} }
  • Klassi atribuute on võimalik märkida kirjutuskaitstud juurdepääsuks (sellistes atribuutides olevat teavet saab kirjutada ainult üks kord, pärast seda pole see enam saadaval). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Pealkiri', /* … */); $post->title = 'Muu'; > Viga: kirjutuskaitstud atribuuti ei saa muuta Post::$title
  • Kutsutavate objektide jaoks on rakendatud uus süntaks – sulgemise saab nüüd moodustada, kutsudes välja funktsiooni ja andes sellele argumendina väärtuse "..." (st myFunc(...) Closure::fromCallable('myFunc) asemel ')): funktsioon foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Lisatud täielik tugi ristmikutüüpidele, mis võimaldab luua uusi tüüpe, kombineerides olemasolevaid. Erinevalt ühendustüüpidest, mis määratlevad kahte või enamat tüüpi kogusid, ei nõua ristumistüübid mitte ühegi loetletud tüüpide olemasolu, vaid kõigi määratud tüüpide olemasolu komplektis, mis tuleb täita. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • On olemas uus tüüp "mitte kunagi", mida saab kasutada staatiliste analüsaatorite teavitamiseks, et funktsioon lõpetab programmi täitmise, näiteks tehes erandi või käivitades väljumisfunktsiooni. function dd(mixed $input): never { exit; }
  • Välja on pakutud uus funktsioon massiiv_is_loend, mis võimaldab määrata, et massiivi võtmed on järjestatud kasvavate arvväärtuste järjekorras, alustades 0-st: $loend = [“a”, “b”, “c”]; massiiv_is_loend($loend); // tõsi $notAList = [1 => "a", 2 => "b", 3 => "c"]; massiiv_on_loend($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; massiiv_is_loend($soNotAList); // vale
  • Nüüd saate kasutada "lõplikku" märksõna, et vältida klassi põhikonstantide ülekirjutamist. class Foo { final public const X = "foo"; } class Riba laiendab Foo { public const X = "bar"; > Saatuslik viga: riba::X ei saa alistada lõppkonstanti Foo::X}
  • Funktsioonid fsync ja fdatasync on mõeldud muudatuste salvestamiseks ketta vahemälust. $fail = fopen("näidis.txt", "w"); fwrite($fail, "Mõned sisu"); if (fsync($file)) { echo "Fail on edukalt kettale salvestatud."; } fclose($fail);
  • Lisatud on võimalus kasutada kaheksandarvude eesliiteid "0o" ja "0O", lisaks varem kasutatud eesliite "0". 016 === 0o16; // tõsi 016 === 0O16; // tõsi
  • Tehakse ettepanek piirata valikuliselt $GLOBALSi kasutamist, mis viib tagasiühilduvuse rikkumiseni, kuid võimaldab oluliselt kiirendada toiminguid massiividega. Näiteks kaalutakse võimalust keelata $GLOBALS-i kirjutamine ja suunata $GLOBALS kursoriga. 2000 paketi analüüs näitas, et see muudatus puudutab neist vaid 23. Näiteks kui ettepanek kiidetakse heaks, ei toeta 8.1 enam selliseid väljendeid nagu: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Sisemised meetodid peaksid nüüd tagastama õige tüübi. PHP 8.1 puhul annab funktsiooni deklaratsioonile mittevastava tüübi tagastamine hoiatuse, kuid PHP 9.0 puhul asendatakse hoiatus veaga.
  • Jätkati tööd funktsioonide ülekandmisel ressursside kasutamisest objektide manipuleerimisele. Funktsioonid finfo_* ja imap_* on objektidele üle kantud.
  • Nullväärtuste argumentidena edastamine mittenullitavaks märgitud sisefunktsioonidele on aegunud. PHP 8.1 puhul toob selliste konstruktsioonide kasutamine nagu str_contains("string", null) kaasa hoiatuse ja PHP 9 puhul vea.
  • Lisatud tugi MurmurHash3 ja xxHash räsimise algoritmidele.

Allikas: opennet.ru

Lisa kommentaar