Lëshimi i gjuhës programuese PHP 8.1

Pas një viti zhvillimi, u prezantua lirimi i gjuhës programuese PHP 8.1. Dega e re përfshin një sërë veçorish të reja, si dhe disa ndryshime që prishin përputhshmërinë.

Përmirësimet kryesore në PHP 8.1:

  • Mbështetje e shtuar për numërimet, për shembull, tani mund të përdorni konstruktet e mëposhtme: enum Status { case Në pritje; rasti Aktiv; rasti i arkivuar; } class Post { funksion publik __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Mbështetje e shtuar për fijet e lehta të quajtura Fibers, të cilat ju lejojnë të menaxhoni fijet e ekzekutimit në një nivel të ulët. Mbështetja e fibrave është planifikuar të shtohet në kornizat Amphp dhe ReactPHP. $fiber = fibër e re(funksioni (): void { $valueAfterResuming = Fibra::suspend('pas pezullimit'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('pas rifillimit');
  • Zbatimi i cache-it të kodit të objektit (opcache) është përmirësuar, duke bërë të mundur ruajtjen e informacionit në memorie për trashëgiminë e klasës. Optimizimi bëri të mundur rritjen e performancës së disa aplikacioneve me 5-8%. Optimizimet e tjera përfshijnë optimizimin e funksionimit JIT, zbatimin e mbështetjes JIT për arkitekturën ARM64 (AArch64), përshpejtimin e rezolucionit të emrit, optimizimin e bibliotekave të libitit kohor dhe ext/date, rritjen e performancës së serializimit dhe deserializimit, optimizimin e get_declared_classes(), explode() , funksioni strtr(), strnatcmp(), dechex(). Në përgjithësi, ka një rritje 23.0% në performancën për Symfony Demo dhe 3.5% për WordPress.
  • Operatori i zbërthimit brenda vargjeve "...$var", i cili lejon zëvendësimin e vargjeve ekzistuese gjatë përcaktimit të një grupi të ri, është zgjeruar për të mbështetur çelësat e vargjeve (më parë mbështeteshin vetëm identifikuesit dixhitalë). Për shembull, tani mund të përdorni në kod: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump ($array); // ["a" => 1, "b" => 2]
  • Lejohet të përdoret fjala kyçe "e re" në inicializuesit, si në përkufizimet e funksioneve si parametër i paracaktuar ose në atributet e argumenteve. class MyController { funksion publik __construct( privat Logger $logger = new NullLogger(), ) {} }
  • Është e mundur të shënohen vetitë e klasës për akses vetëm për lexim (informacioni në vetitë e tilla mund të shkruhet vetëm një herë, pas së cilës nuk do të jetë i disponueshëm për ndryshim). class PostData { funksion publik __construct( varg publik vetëm për lexim $titull, publik vetëm për lexim DateTimeImmutable $date, ) {} } $post = postim i ri ('Titulli', /* … */); $post->title = 'Tjetër'; > Gabim: Nuk mund të modifikohet vetia vetëm për lexim Postimi::$title
  • Një sintaksë e re është zbatuar për objektet e thirrshme - një mbyllje tani mund të formohet duke thirrur një funksion dhe duke i kaluar vlerën "..." si argument (d.m.th. myFunc(...) në vend të Closure::fromCallable('myFunc ')): funksioni foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • U shtua mbështetje e plotë për llojet e kryqëzimeve, duke ju lejuar të krijoni lloje të reja duke kombinuar ato ekzistuese. Ndryshe nga llojet e bashkimeve, të cilat përcaktojnë koleksionet e dy ose më shumë llojeve, llojet e kryqëzimeve kërkojnë praninë e jo ndonjë prej llojeve të listuara, por të gjithë llojeve të specifikuara në grup për t'u mbushur. funksion generateSlug(HasTitle&HasId $post) { return sttolower($post->getTitle()) . $post->getId(); }
  • Ekziston një lloj i ri "kurrë" që mund të përdoret për të informuar analizuesit statikë se një funksion do të përfundojë ekzekutimin e programit, për shembull duke hedhur një përjashtim ose duke ekzekutuar funksionin e daljes. funksioni dd(përzier $input): kurrë { dalje; }
  • Është propozuar një funksion i ri array_is_list, i cili ju lejon të përcaktoni se çelësat në grup janë të renditur sipas radhës së rritjes së vlerave numerike, duke filluar nga 0: $list = [“a”, “b”, “c”]; grupi_është_lista ($lista); // vërtetë $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; grupi_është_lista ($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list ($alsoNotAList); // i rremë
  • Tani mund të përdorni fjalën kyçe "përfundimtare" për të parandaluar anashkalimin e konstanteve të klasës prind. class Foo { const publik përfundimtar X = "foo"; } class Bar extensions Foo { public const X = "bar"; > Gabim fatal: Shiriti::X nuk mund të anashkalojë konstanten përfundimtare Foo::X }
  • Funksionet fsync dhe fdatasync janë propozuar për të detyruar ndryshimet që të ruhen nga cache e diskut. $file = fopen("sample.txt", "w"); fwrite($file, "Disa përmbajtje"); if (fsync($file)) { echo "Skedari është ruajtur me sukses në disk."; } fclose($file);
  • U shtua aftësia për të përdorur parashtesat "0o" dhe "0O" për numrat oktalë, përveç prefiksit të përdorur më parë "0". 016 === 0o16; // e vërtetë 016 === 0O16; // e vërtetë
  • Propozohet të kufizohet në mënyrë selektive përdorimi i $GLOBALS, gjë që do të çojë në një shkelje të përputhshmërisë së prapambetur, por do të bëjë të mundur përshpejtimin e ndjeshëm të operacioneve me vargje. Për shembull, po shqyrtohet mundësia e çaktivizimit të shkrimit në $GLOBALS dhe kalimi i $GLOBALS me tregues. Një analizë e 2000 paketave tregoi se vetëm 23 prej tyre do të prekeshin nga ky ndryshim. Për shembull, nëse propozimi miratohet, 8.1 nuk do të mbështesë më shprehje të tilla si: $GLOBALS = []; $GLOBALS += []; $GLOBALE =& $x; $x =& $GLOBALS; unset ($GLOBALS); nga_ref($GLOBALS);
  • Metodat e brendshme tani duhet të kthejnë llojin e duhur. Në PHP 8.1, kthimi i një lloji që nuk përputhet me deklaratën e funksionit do të prodhojë një paralajmërim, por në PHP 9.0 paralajmërimi do të zëvendësohet me një gabim.
  • Puna vazhdoi për transferimin e funksioneve nga përdorimi i burimeve në manipulimin e objekteve. Funksionet finfo_* dhe imap_* janë transferuar në objekte.
  • Kalimi i vlerave null si argumente në funksionet e brendshme të shënuara si jo të pavlefshme është zhvlerësuar. Në PHP 8.1, përdorimi i konstrukteve si str_contains ("string", null) do të çojë në një paralajmërim, dhe në PHP 9 në një gabim.
  • Mbështetje e shtuar për algoritmet e hashimit MurmurHash3 dhe xxHash.

Burimi: opennet.ru

Shto një koment