Pärast aasta kestnud arendust on välja antud programmeerimiskeele PHP 8.1 versioon. Uus haru sisaldab rida uusi võimalusi ning ka mitmeid ühilduvuse rikkumisi.
PHP 8.1 võtmeuuendused:
- Lisatud on toimetuste toetamine, näiteks saab kasutada järgmisi konstruktsioone: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
- Tuged on lisatud kergekaalulistele niitidele, mida nimetatakse fiiberiteks (Fiber) ja mis võimaldavad madala taseme täitmisvoogude haldamist. Fiibrite toetust plaanitakse lisada Amphp ja ReactPHP raamistikesse. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
- Objektikoodi vahemälu (opcache) rakendust on parandatud, võimaldades salvestada klasside pärimisinfot. Optimeerimine tõi kaasa 5-8% jõudluse tõusu mõnedes rakendustes. Teiste optimeerimiste seas on esile tõstetud JIT töötluse optimeerimist, JIT toe rakendamist ARM64 (AArch64) arhitektuurile, nimede lahendamise kiirendamist, timelib ja ext/date teekide optimeerimist, andmete serialiseerimise ja deserialiseerimise jõudluse tõstmist, samuti funktsioonide get_declared_classes(), explode(), strtr(), strnatcmp(), dechex() optimeerimist. Üldiselt on Symfony demo jõudlus paranenud 23.0% ja WordPress 3.5%.
- Massiivide sisemiste lahtipakkimise operaator «…$var» on laiendatud stringi võtmete toega (varem toetati vaid numbrilisi identifikaatoreid). Näiteks on nüüd võimalik koodis kasutada: $array1 = ["a" => 1]; $array2 = ["b" => 2]; $array = ["a" => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
- Muutuja initsialiseerijates on lubatud kasutada märksõna "new", näiteks funktsioonide määratlemisel vaikimisi parameetrina või argumentide atribuutides. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
- On antud võimalus märkida klassi omadused ainult lugemiseks (sarnastes omadustes olev teave saab kirjutada ainult üks kord, pärast mida ei ole seda võimalik muuta). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post(‘Title’, /* … */); $post->title = ‘Other’; > Error: Cannot modify readonly property Post::$title
- On rakendatud uus süntaks kutsutud objektide (callable) jaoks — nüüd saab sulguna moodustada, kutsudes funktsiooni ja edastades sellele argumendina väärtuse «…» (st myFunc(…) asemel Closure::fromCallable(‘myFunc’)): function foo(int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
- On lisatud täielik tugi risttüüpidele (intersection types), mis võimaldavad luua uusi tüüpe, kombineerides olemasolevaid. Erinevalt ühinemistüüpidest, mis määravad kahe või enama tüübi kollektsiooni, nõuavad risttüübid, et täidetava kogumi hulgas oleksid kõik loetletud tüübid, mitte lihtsalt ükskõik milline nendest. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
- Uus tüüp «never» on nüüd saadaval, mida saab kasutada staatiliste analüsaatorite teavitamiseks, et funktsioon lõpetab programmi täitmise, näiteks exception'i viskamise või exit-funktsiooni kutsumisega. function dd(mixed $input): never { exit; }
- Uus funktsioon array_is_list on pakutud, mis võimaldab määrata, kas massiivi võtmed on järjestatud kasvavas järjekorras alates 0: $list = ["a", "b", "c"]; array_is_list($list); // true $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // false
- Nüüd saab vanema klassi konstandi üle määramise keelamiseks kasutada märksõna „final“. class Foo { final public const X = «foo»; } class Bar extends Foo { public const X = «bar»; > Fatal error: Bar::X ei saa üle määrata final konstandile Foo::X }
- Käsklused fsync ja fdatasync on ette nähtud muudatuste sundimiseks ketta vahemälust salvestamiseks. $file = fopen("sample.txt", "w"); fwrite($file, "Some content"); if (fsync($file)) { echo "Fail on edukalt kettale salvestatud."; } fclose($file);
- Lisatud on võimalus kasutada prefikse „0o” ja „0O” kaheksandate arvude jaoks, lisaks varem kasutatud prefiksile „0”. 016 === 0o16; // true 016 === 0O16; // true
- On soovitatud piirata $GLOBALS kasutamist, mis võib viia tagurpidi ühilduvuse rikkumiseni, kuid võimaldab oluliselt kiirendada massiividega töötamist. Näiteks kaalutakse võimalust keelata kirjutamine $GLOBALS-sse ja edastada $GLOBALS viitena. 2000 paketi analüüs näitas, et ainult 23 neist mõjutaks see muudatus. Kui ettepanek heaks kiidetakse, lõpetatakse 8.1 versioonis selliste konstruktsioonide toetamine nagu: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
- Sisemised meetodid peavad nüüd tagastama õige tüübi. PHP 8.1 puhul, kui tagastatav tüüp ei vasta funktsiooni deklareerimisele, genereeritakse hoiatus, kuid PHP 9.0 puhul asendatakse hoiatus veaga.
- Jätkatakse funktsioonide tõlkimist ressursipõhiselt objektipõhiseks. Funktsioonid finfo_* ja imap_* on muudetud objekti kasutamiseks.
- On kuulutatud vananenuks null väärtuste edastamine sisemiste funktsioonide argumentidena, mis on tähistatud kui non-nullable. PHP 8.1 kasutamine str_contains('string', null) viib hoiatusele, ja PHP 9-s viga.
- Toetatavaks on lisatud MurmurHash3 ja xxHash hajutusalgoritmid.
Allikas: opennet.ru
