PHP 8.1 ծրագրավորման լեզվի թողարկում

Մեկ տարվա մշակումից հետո ներկայացվեց PHP 8.1 ծրագրավորման լեզվի թողարկումը։ Նոր մասնաճյուղը ներառում է մի շարք նոր հնարավորություններ, ինչպես նաև մի քանի փոփոխություններ, որոնք խախտում են համատեղելիությունը:

Հիմնական բարելավումներ PHP 8.1-ում.

  • Ավելացվեց թվարկումների աջակցությունը, օրինակ, այժմ կարող եք օգտագործել հետևյալ կառուցվածքները. enum Status { case Prending; գործը Ակտիվ; գործ Արխիվացված; } class Post { public function __construct( private Status $status = Status::Spending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Ավելացվել է թեթև թելերի աջակցություն, որը կոչվում է Fibers, որը թույլ է տալիս կառավարել կատարողական թելերը ցածր մակարդակով: Օպտիկամանրաթելային աջակցությունը նախատեսվում է ավելացնել Amphp և ReactPHP շրջանակներին: $fiber = new Fiber(function (): void {$valueAfterResuming = Fiber::suspend('spending after'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume ('վերսկսելուց հետո');
  • Բարելավվել է օբյեկտի կոդի քեշի (opcache) ներդրումը, ինչը հնարավորություն է տալիս քեշավորել դասի ժառանգության մասին տեղեկատվությունը: Օպտիմալացումը թույլ տվեց բարձրացնել որոշ հավելվածների կատարողականը 5-8%-ով: Այլ օպտիմիզացումները ներառում են JIT-ի շահագործման օպտիմիզացում, ARM64 ճարտարապետության համար JIT աջակցության ներդրում (AArch64), անվան լուծման արագացում, timelib և ext/date գրադարանների օպտիմիզացում, սերիալիզացիայի և ապասերիալիզացիայի արդյունավետության բարձրացում, get_declared_classes(), explode() , strtr() ֆունկցիա, strnatcmp(), dechex(): Ընդհանուր առմամբ, Symfony Demo-ի համար կա կատարողականի 23.0%, իսկ WordPress-ի համար՝ 3.5%:
  • «...$var» զանգվածների ներսում ապափաթեթավորող օպերատորը, որը թույլ է տալիս փոխարինել գոյություն ունեցող զանգվածները նոր զանգված սահմանելիս, ընդլայնվել է լարային ստեղների աջակցությամբ (նախկինում միայն թվային նույնացուցիչներն էին աջակցվում): Օրինակ, այժմ կարող եք օգտագործել կոդում՝ $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump ($զանգված); // ["a" => 1, "b" => 2]
  • Թույլատրվում է օգտագործել «նոր» հիմնաբառը սկզբնավորիչներում, օրինակ՝ ֆունկցիաների սահմանումներում որպես լռելյայն պարամետր կամ արգումենտի ատրիբուտներում։ class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Դասի հատկությունները հնարավոր է նշել միայն կարդալու համար (այդպիսի հատկությունների տեղեկատվությունը կարող է գրվել միայն մեկ անգամ, որից հետո այն հասանելի չի լինի փոփոխության համար): class PostData { public function __construct( public only read string $title, public only reading DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Այլ'; > Սխալ. հնարավոր չէ փոփոխել միայն կարդալու հատկությունը Հաղորդագրություն::$title
  • Նոր շարահյուսություն է ներդրվել կանչվող օբյեկտների համար. այժմ փակումը կարող է ձևավորվել՝ ֆունկցիան կանչելով և որպես արգումենտ փոխանցելով «...» արժեքը (այսինքն՝ myFunc(...) Closure::fromCallable('myFunc) փոխարեն: ')): ֆունկցիա foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo (a: 1, b: 2);
  • Ավելացվեց խաչմերուկների տեսակների ամբողջական աջակցությունը, որը թույլ է տալիս ստեղծել նոր տեսակներ՝ համատեղելով գոյություն ունեցողները: Ի տարբերություն միության տեսակների, որոնք սահմանում են երկու կամ ավելի տեսակների հավաքածուներ, խաչմերուկի տեսակները պահանջում են ոչ թե թվարկված տեսակներից որևէ մեկի առկայությունը, այլ բոլոր նշված տիպերի առկայությունը, որոնք պետք է լրացվեն: function generateSlug(HasTitle&HasId $post) { return sttolower($post->getTitle()) . $post->getId(); }
  • Գոյություն ունի «երբեք» նոր տեսակ, որը կարող է օգտագործվել ստատիկ անալիզատորներին տեղեկացնելու համար, որ գործառույթը կդադարեցնի ծրագրի կատարումը, օրինակ՝ բացառություն գցելով կամ կատարելով ելքի գործառույթը: ֆունկցիա dd(խառը $input): երբեք {ելք; }
  • Առաջարկվել է array_is_list նոր ֆունկցիա, որը թույլ է տալիս որոշել, որ զանգվածի ստեղները դասավորված են ըստ թվային արժեքների մեծացման՝ սկսած 0-ից՝ $list = [“a”, “b”, “c”]; array_is_list ($list); // ճշմարիտ $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list ($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list ($alsoNotAList); // կեղծ
  • Այժմ դուք կարող եք օգտագործել «վերջնական» բանալի բառը՝ կանխելու ծնող դասի հաստատունների անտեսումը: class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Ճակատագրական սխալ. Bar::X-ը չի կարող վերացնել վերջնական հաստատունը Foo::X }
  • fsync և fdatasync գործառույթներն առաջարկվում են ստիպելու փոփոխությունները պահպանել սկավառակի քեշից: $file = fopen ("sample.txt", "w"); fwrite ($file, «Որոշ բովանդակություն»); if (fsync($file)) { echo "Ֆայլը հաջողությամբ պահպանվել է սկավառակի վրա"; } fclose ($ file);
  • Ավելացվել է օկտալ թվերի համար «0o» և «0O» նախածանցներն օգտագործելու հնարավորությունը, ի լրումն նախկինում օգտագործված «0» նախածանցի: 016 === 0o16; // ճշմարիտ 016 === 0O16; // ճիշտ
  • Առաջարկվում է ընտրողաբար սահմանափակել $GLOBALS-ի օգտագործումը, ինչը կհանգեցնի հետընթաց համատեղելիության խախտման, սակայն հնարավորություն կտա զգալիորեն արագացնել գործողությունները զանգվածներով։ Օրինակ, դիտարկվում է $GLOBALS-ում գրելը անջատելու և $GLOBALS-ի ցուցիչով փոխանցելու հնարավորությունը: 2000 փաթեթների վերլուծությունը ցույց է տվել, որ դրանցից միայն 23-ի վրա է տուժելու այս փոփոխությունը։ Օրինակ, եթե առաջարկը հաստատվի, 8.1-ն այլևս չի աջակցի այնպիսի արտահայտություններ, ինչպիսիք են՝ $GLOBALS = []; $GLOBALS += []; $ GLOBALS =& $ x; $x =& $GLOBALS; unset ($ GLOBALS); by_ref ($ GLOBALS);
  • Ներքին մեթոդներն այժմ պետք է վերադարձնեն ճիշտ տեսակը: PHP 8.1-ում ֆունկցիայի հայտարարագրին չհամապատասխանող տիպ վերադարձնելով նախազգուշացում, սակայն PHP 9.0-ում զգուշացումը կփոխարինվի սխալով:
  • Շարունակվել է աշխատանքը ռեսուրսների օգտագործումից օբյեկտների մանիպուլյացիայի գործառույթները փոխանցելու ուղղությամբ: Finfo_* և imap_* ֆունկցիաները փոխանցվել են օբյեկտներին:
  • Անվավեր արժեքների փոխանցումը որպես արգումենտ ներքին գործառույթներին, որոնք նշված են որպես ոչ զրոյական, հնացել է: PHP 8.1-ում str_contains("string", null) նման կառուցվածքների օգտագործումը կհանգեցնի նախազգուշացման, իսկ PHP 9-ում՝ սխալի։
  • Ավելացվեց աջակցություն MurmurHash3 և xxHash հեշավորման ալգորիթմների համար:

Source: opennet.ru

Добавить комментарий