Dopu un annu di sviluppu, a liberazione di a lingua di prugrammazione PHP 8.1 hè stata presentata. U novu ramu include una seria di funzioni novi, è ancu parechji cambiamenti chì rompenu a cumpatibilità .
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ Π² PHP 8.1:
- Aghjunghje supportu per l'enumerazioni, per esempiu, pudete avΓ aduprΓ e seguenti custruzzioni: enum Status { case Pending ; casu Active; casu Archivatu; } class Post { public function __construct (private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // β¦ } } $post->setStatus(Status::Active);
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ±Π΅ΡΠ°ΠΌΠΈ (Fiber) ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ°ΠΉΠ±Π΅ΡΠΎΠ² ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Amphp ΠΈ ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(βafter suspendingβ); // β¦ }); $valueAfterSuspending = $fiber->start(); $fiber->resume(βafter resumingβ);
- Π£Π»ΡΡΡΠ΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (opcache), Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΏΠΎΠ΄Π½ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° 5-8%. ΠΠ· Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±ΠΎΡΡ JIT, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ JIT Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ARM64 (AArch64), ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΡΠ½, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ timelib ΠΈ ext/date, ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ get_declared_classes(), explode(), strtr(), strnatcmp(), dechex(). Π ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Symfony Demo Π½Π° 23.0%, Π° WordPress Π½Π° 3.5%.
- L'operatore di unpacking in arrays "...$var", chΓ¬ permette a sustituzione di arrays esistenti quandu definisce un novu array, hΓ¨ statu allargatu per supportΓ e chjave di stringa (prima solu l'identificatori digitali eranu supportati). Per esempiu, pudete avΓ aduprΓ in codice: $array1 = ["a" => 1]; $array2 = ["b" => 2]; $array = [βaβ => 0, β¦$array1, β¦$array2]; var_dump($array); // ["a" => 1, "b" => 2]
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Β«newΒ» Π² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ°Ρ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ Π² Π°ΡΡΠΈΠ±ΡΡΠ°Ρ Π°ΡΠ³ΡΠΌΠ΅ΡΠΎΠ². class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ ΡΠ²ΠΎΠΉΡΡΠ² ΠΊΠ»Π°ΡΡΠ° Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ). 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
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (callable) β Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ, Π²ΡΠ·Π²Π°Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Β«β¦Β» (Ρ.Π΅. myFunc(β¦) Π²ΠΌΠ΅ΡΡΠΎ Closure::fromCallable(βmyFuncβ)): function foo(int $a, int $b) { /* β¦ */ } $foo = foo(β¦); $foo(a: 1, b: 2);
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ ΡΡ ΡΠΈΠΏΠΎΠ² (intersection types), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ union-ΡΠΈΠΏΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈΠ· Π΄Π²ΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΠΏΠΎΠ², intersection-ΡΠΈΠΏΡ ΡΡΠ΅Π±ΡΡΡ Π½Π°Π»ΠΈΡΠΈΡ Π² Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Π½Π΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ², Π° Π²ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ². function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
- Ci hè un novu tipu "mai" chì pò esse usatu per informà l'analizzatori statichi chì una funzione finisce l'esekzione di u prugramma, per esempiu, scacciendu una eccezzioni o eseguendu a funzione di uscita. funzione dd(mixed $input): mai { exit; }
- Una nova funzione array_is_list hΓ¨ stata pruposta, chΓ¬ permette di determinΓ chΓ¬ i chjavi in ββl'array sΓ² disposti in ordine di valori numerichi crescente, partendu da 0: $list = ["a", "b", "c"]; array_is_list($lista); // true $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // falsu
- ΠΠ»Ρ Π·Π°ΠΏΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Β«finalΒ». class Foo { final public const X = Β«fooΒ»; } class Bar extends Foo { public const X = Β«barΒ»; > Fatal error: Bar::X cannot override final constant Foo::X }
- E funzioni fsync è fdatasync sò pruposte per furzà i cambiamenti per esse salvati da a cache di discu. $file = fopen ("sample.txt", "w"); fwrite($file, "Qualchì cuntenutu"); if (fsync($file)) { echo "U schedariu hè statu persistatu cù successu à u discu."; } fclose($file);
- Aghjunghje a capacitΓ di utilizΓ i prefissi "0o" Γ¨ "0O" per i numeri ottali, in piΓΉ di u prefissu "0" utilizatu prima. 016 === 0o16; // veru 016 === 0O16; // veru
- Hè prupostu di limità selettivamente l'usu di $GLOBALS, chì portarà à una violazione di cumpatibilità retrocede, ma permetterà di accelerà significativamente l'operazioni cù arrays. Per esempiu, a pussibilità di disattivà a scrittura à $ GLOBALS è di passà $ GLOBALS per puntatore hè stata cunsiderata. Un analisi di 2000 pacchetti hà dimustratu chì solu 23 di elli seranu affettati da stu cambiamentu. Per esempiu, se a pruposta hè appruvata, 8.1 ùn sustene più espressioni cum'è: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $ GLOBALI; unset($GLOBALS); by_ref($GLOBALS);
- ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΈΠΏ. Π PHP 8.1 ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΡΠΈΠΏΠ°, Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π½ΠΎ Π² PHP 9.0 ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ.
- U travagliu cuntinuΓ² nantu Γ u trasferimentu di funzioni da l'usu di risorse Γ a manipulazione di l'uggetti. E funzioni finfo_* Γ¨ imap_* sΓ² state trasferite Γ l'uggetti.
- Passà i valori nulli cum'è argumenti à e funzioni interne marcate micca nullable hè statu deprecatu. In PHP 8.1, l'usu di custruzzioni cum'è str_contains ("string", null) porta à un avvisu, è in PHP 9 à un errore.
- Aghjunghje supportu per l'algoritmi di hashing MurmurHash3 Γ¨ xxHash.
Source: opennet.ru