Eldono de PHP 8.1 programlingvo

Post jaro da evoluo, la eldono de la programlingvo PHP 8.1 estis prezentita. La nova branĉo inkluzivas serion de novaj funkcioj, same kiel plurajn ŝanĝojn, kiuj rompas kongruon.

Ŝlosilaj plibonigoj en PHP 8.1:

  • Aldonita subteno por enumeracioj, ekzemple, vi nun povas uzi la jenajn konstrukciojn: enum Statuso { case Pending; kazo Aktiva; kazo Arkivita; } klaso Afiŝu { publika funkcio __konstrui( privata Statuso $stato = Statuso::Pripendata; ) {} publika funkcio setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Aldonita subteno por malpezaj fadenoj nomitaj Fibroj, kiuj ebligas al vi administri ekzekutfadenojn je malalta nivelo. Fibra subteno estas planita esti aldonita al la kadroj Amphp kaj ReactPHP. $fibro = nova Fibro (funkcio (): void { $valoroAfterResuming = Fibro::suspend ('post suspendo'); // ... }); $valoroPostSuspendo = $fibro->komenco(); $fibro->rekomenci('post rekomenco');
  • La efektivigo de la objektkoda kaŝmemoro (opcache) estis plibonigita, ebligante konservi informojn pri klasa heredo. Optimumigo ebligis pliigi la agadon de iuj aplikoj je 5-8%. Aliaj optimumigoj inkludas optimumigon de JIT-operacio, efektivigon de JIT-subteno por la ARM64-arkitekturo (AArch64), akcelon de nomrezolucio, optimumigo de timelib kaj ext/date-bibliotekoj, pliigita seriigo kaj deserialig-efikeco, optimumigo de la get_declared_classes (), eksplodo () , strtr() funkcio, strnatcmp(), dechex(). Ĝenerale, estas 23.0% pliiĝo en rendimento por Symfony Demo, kaj 3.5% por WordPress.
  • La malpakiga funkciigisto ene de tabeloj "...$var", kiu permesas anstataŭigon de ekzistantaj tabeloj dum difinado de nova tabelo, estis etendita por subteni ĉenŝlosilojn (antaŭe nur ciferecaj identigiloj estis apogitaj). Ekzemple, vi nun povas uzi en kodo: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($tabelo); // ["a" => 1, "b" => 2]
  • Estas permesite uzi la "novan" ŝlosilvorton en inicialigiloj, kiel ekzemple en funkciodifinoj kiel defaŭlta parametro aŭ en argumentaj atributoj. klaso MyController { publika funkcio __konstrui( privata Logger $logger = nova NullLogger (), ) {} }
  • Eblas marki klasajn trajtojn por nurlegebla aliro (informoj en tiaj trajtoj povas esti skribitaj nur unufoje, post kio ĝi ne estos disponebla por ŝanĝo). klaso PostDatumoj { publika funkcio __konstrui( publika nurlegebla ĉeno $titolo, publika nurlegebla DatoTempoNeŝanĝebla $dato, ) {} } $afiŝo = nova Afiŝo ('Titolo', /* … */); $post->title = 'Aliaj'; > Eraro: Ne povas modifi nurlegeblan proprieton Post::$titolo
  • Nova sintakso estis efektivigita por alvokeblaj objektoj - fermo nun povas esti formita per vokado de funkcio kaj pasante al ĝi la valoron "..." kiel argumento (t.e. myFunc(...) anstataŭ Fermo::fromCallable('myFunc) ')): funkcio foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Aldonita plena subteno por intersekciĝospecoj, permesante al vi krei novajn tipojn kombinante ekzistantajn. Male al sindikatspecoj, kiuj difinas kolektojn de du aŭ pli da tipoj, intersekcspecoj postulas la ĉeeston de ne iu ajn el la listigitaj tipoj, sed ĉiuj el la specifitaj tipoj en la aro por esti plenigitaj. function generiSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Ekzistas nova tipo "neniam" kiu povas esti uzita por informi senmovajn analizistojn ke funkcio finos programekzekuton, ekzemple ĵetante escepton aŭ efektivigante la elirfunkcion. funkcio dd(miksita $enigo): neniam { eliro; }
  • Nova funkcio array_is_list estis proponita, kiu ebligas al vi determini ke la klavoj en la tabelo estas aranĝitaj en ordo de kreskantaj nombraj valoroj, komencante de 0: $list = [“a”, “b”, “c”]; tabelo_estas_listo($listo); // vera $notAListo = [1 => “a”, 2 => “b”, 3 => “c”]; tabelo_estas_listo($neAlisto); // malvera $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; tabelo_estas_listo($ankaŭNeAlisto); // malvera
  • Vi nun povas uzi la "finan" ŝlosilvorton por malhelpi gepatrajn klaskonstantojn esti anstataŭitaj. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "stango"; > Mortiga eraro: Bar::X ne povas superregi finan konstanton Foo::X }
  • La fsync kaj fdatasync-funkcioj estas proponitaj por devigi ŝanĝojn esti konservitaj el la diskkaŝmemoro. $dosiero = fopen("specimeno.txt", "w"); fwrite($dosiero, "Iom da enhavo"); if (fsync($dosiero)) { echo "Dosiero estis sukcese konservita al disko."; } fclose($dosiero);
  • Aldonis la eblon uzi la prefiksojn "0o" kaj "0O" por oktalaj nombroj, krom la antaŭe uzata prefikso "0". 016 === 0o16; // vera 016 === 0O16; // vera
  • Oni proponas selekteme limigi la uzon de $GLOBALS, kio kondukos al malobservo de retrokongruo, sed ebligos signife akceli operaciojn kun tabeloj. Ekzemple, oni konsideras la eblecon malŝalti skribadon al $GLOBALS kaj pasi $GLOBALS per montrilo. Analizo de 2000 pakaĵoj montris ke nur 23 el ili estus trafitaj de tiu ŝanĝo. Ekzemple, se la propono estas aprobita, 8.1 ne plu subtenos esprimojn kiel: $GLOBALS = []; $TUTmondaj += []; $TUTmondaj =& $x; $x =& $TUTMUNDOJ; malstarigi($TUTmondaj); de_ref($TUTmondaj);
  • Internaj metodoj nun devus redoni la ĝustan tipon. En PHP 8.1, redoni tipon kiu ne kongruas kun la funkcio-deklaro produktos averton, sed en PHP 9.0 la averto estos anstataŭigita per eraro.
  • Laboro daŭris pri translokado de funkcioj de uzado de rimedoj ĝis manipulado de objektoj. La finfo_* kaj imap_* funkcioj estis transdonitaj al objektoj.
  • Transdono de nulaj valoroj kiel argumentoj al internaj funkcioj markitaj ne-nuleblaj estis malrekomendita. En PHP 8.1, uzi konstrukciojn kiel str_contains ("string", null) kondukos al averto, kaj en PHP 9 al eraro.
  • Aldonita subteno por MurmurHash3 kaj xxHash hashing algoritmoj.

fonto: opennet.ru

Aldoni komenton