PHP 8.1 ohjelmointikielen julkaisu

Vuoden kehitystyön jälkeen esiteltiin PHP 8.1 -ohjelmointikielen julkaisu. Uusi haara sisältää joukon uusia ominaisuuksia sekä useita yhteensopivuuden rikkovia muutoksia.

Tärkeimmät parannukset PHP 8.1:ssa:

  • Lisätty tuki esimerkiksi luetteloille, voit nyt käyttää seuraavia rakenteita: enum Status { case Pending; kotelo aktiivinen; asia Arkistoitu; } class Viesti { public function __construct( yksityinen Tila $tila = Tila::Odottaa; ) {} public function setStatus(Tila $tila): void { // … } } $post->setStatus(Tila::Active);
  • Lisätty tuki kevyille säikeille nimeltä Fibers, jonka avulla voit hallita suoritussäikeitä alhaisella tasolla. Kuitutuki on tarkoitus lisätä Amphp- ja ReactPHP-kehyksiin. $kuitu = new Fiber(funktio (): void { $valueAfterResuming = Kuitu::suspend('keskeytyksen jälkeen'); // ... }); $arvoAfterSuspending = $kuitu->aloitus(); $fiber->resume('jatkamisen jälkeen');
  • Objektikoodivälimuistin (opcache) toteutusta on parannettu, mikä mahdollistaa luokan periytymistä koskevien tietojen tallentamisen välimuistiin. Optimointi mahdollisti joidenkin sovellusten suorituskyvyn lisäämisen 5-8 %. Muita optimointeja ovat JIT-toiminnan optimointi, JIT-tuen käyttöönotto ARM64-arkkitehtuurille (AArch64), nimien resoluution nopeuttaminen, timelib- ja ext/date-kirjastojen optimointi, parannettu serialisoinnin ja deserialisoinnin suorituskyky, get_declared_classes(), explode()-toimintojen optimointi. , strtr()-funktio, strnatcmp(), dechex(). Yleisesti ottaen Symfony Demon suorituskyky on kasvanut 23.0 % ja WordPressin 3.5 %.
  • Pakkauksen purkuoperaattori taulukoiden sisällä "...$var", joka mahdollistaa olemassa olevien taulukoiden korvaamisen uutta taulukkoa määritettäessä, on laajennettu tukemaan merkkijonoavaimia (aiemmin vain digitaalisia tunnisteita tuettiin). Esimerkiksi voit nyt käyttää koodissa: $array1 = ["a" => 1]; $taulukko2 = ["b" => 2]; $taulukko = ["a" => 0, …$taulukko1, …$taulukko2]; var_dump($taulukko); // ["a" => 1, "b" => 2]
  • On sallittua käyttää "uusi" avainsanaa alustuksissa, kuten funktiomäärittelyissä oletusparametrina tai argumenttiattribuuteissa. class MyController { julkinen toiminto __konstrukti( yksityinen lokitiedosto $logger = new NullLogger(), ) {} }
  • Luokkaominaisuuksia on mahdollista merkitä vain luku -käyttöön (tällaisten ominaisuuksien tiedot voidaan kirjoittaa vain kerran, jonka jälkeen niitä ei voi muuttaa). class PostData { julkinen toiminto __konstrukti( julkinen vain luku -merkkijono $otsikko, julkinen vain luku DateTimeImmutable $date, ) {} } $post = new Viesti('Otsikko', /* … */); $post->title = 'Muu'; > Virhe: Ei voida muokata vain luku -ominaisuutta Viesti::$title
  • Kutsuttaville objekteille on otettu käyttöön uusi syntaksi - sulkeminen voidaan nyt muodostaa kutsumalla funktio ja antamalla sille argumenttina arvo "..." (eli myFunc(...) Closure::fromCallable('myFunc) sijaan ')): funktio foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Lisätty täysi tuki risteystyypeille, joten voit luoda uusia tyyppejä yhdistämällä olemassa olevia. Toisin kuin liitostyypit, jotka määrittelevät kahden tai useamman tyypin kokoelmat, risteystyypit eivät vaadi minkään lueteltujen tyyppien läsnäoloa, vaan kaikki määritetyt tyypit täytettävässä joukossa. funktio generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • On olemassa uusi tyyppi "ei koskaan", jolla voidaan ilmoittaa staattisille analysaattoreille, että toiminto lopettaa ohjelman suorittamisen, esimerkiksi heittämällä poikkeuksen tai suorittamalla poistumisfunktion. function dd(mixed $syöte): never { exit; }
  • Uusi funktio array_is_list on ehdotettu, jonka avulla voit määrittää, että taulukon avaimet on järjestetty kasvavaan numeroarvoon, alkaen 0:sta: $lista = ["a", "b", "c"]; array_is_list($lista); // tosi $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($myösNotAList); // väärä
  • Voit nyt käyttää "lopullista" avainsanaa estääksesi yläluokan vakioiden ohittamisen. class Foo {lopullinen julkinen const X = "foo"; } luokka Bar laajentaa Foo { public const X = "bar"; > Vakava virhe: Bar::X ei voi ohittaa lopullista vakiota Foo::X }
  • Fsync- ja fdatasync-funktioita ehdotetaan pakottamaan muutokset tallentamaan levyn välimuistista. $tiedosto = fopen("näyte.txt", "w"); fwrite($file, "Jonkin verran sisältöä"); if (fsync($file)) { echo "Tiedosto on onnistuneesti säilytetty levylle."; } fclose($tiedosto);
  • Lisätty mahdollisuus käyttää etuliitteitä "0o" ja "0O" oktaaliluvuille aiemmin käytetyn etuliite "0" lisäksi. 016 === 0o16; // tosi 016 === 0O16; // totta
  • On ehdotettu, että $GLOBALS:n käyttöä rajoitetaan valikoivasti, mikä johtaa taaksepäin yhteensopivuuden rikkomiseen, mutta mahdollistaa huomattavasti toimintojen nopeuttamisen taulukoiden kanssa. Esimerkiksi mahdollisuutta estää kirjoittaminen $GLOBALSiin ja ohittaa $GLOBALS osoittimella harkitaan. 2000 paketin analyysi osoitti, että tämä muutos vaikuttaa vain 23:een. Jos esimerkiksi ehdotus hyväksytään, 8.1 ei enää tue lausekkeita, kuten: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Sisäisten menetelmien pitäisi nyt palauttaa oikea tyyppi. PHP 8.1:ssä tyypin, joka ei vastaa funktion määritystä, palauttaminen tuottaa varoituksen, mutta PHP 9.0:ssa varoitus korvataan virheellä.
  • Työtä jatkettiin toimintojen siirtämisessä resurssien käytöstä objektien käsittelyyn. Toiminnot finfo_* ja imap_* on siirretty objekteihin.
  • Nolla-arvojen välittäminen argumentteina sisäisille funktioille, jotka on merkitty ei-nolla-arvoiksi, on poistettu käytöstä. PHP 8.1:ssä str_contains("string", null) kaltaisten konstruktien käyttö johtaa varoitukseen ja PHP 9:ssä virheeseen.
  • Lisätty tuki MurmurHash3- ja xxHash-hajautusalgoritmeille.

Lähde: opennet.ru

Lisää kommentti