Keluaran bahasa pengaturcaraan PHP 8.1

Selepas setahun pembangunan, keluaran bahasa pengaturcaraan PHP 8.1 telah dibentangkan. Cawangan baharu ini termasuk satu siri ciri baharu, serta beberapa perubahan yang memecahkan keserasian.

Penambahbaikan utama dalam PHP 8.1:

  • Menambah sokongan untuk penghitungan, sebagai contoh, anda kini boleh menggunakan binaan berikut: enum Status { case Pending; kes Aktif; kes Arkib; } 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%.
  • Operator pembongkaran di dalam tatasusunan "...$var", yang membenarkan penggantian tatasusunan sedia ada semasa mentakrif tatasusunan baharu, telah diperluaskan untuk menyokong kunci rentetan (sebelum ini hanya pengecam digital yang disokong). Sebagai contoh, anda kini boleh menggunakan dalam kod: $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(); }
  • Terdapat jenis baharu "tidak pernah" yang boleh digunakan untuk memaklumkan penganalisis statik bahawa fungsi akan menamatkan pelaksanaan program, contohnya dengan membuang pengecualian atau melaksanakan fungsi keluar. fungsi dd(campuran $input): jangan sekali-kali { keluar; }
  • Satu array_is_list fungsi baharu telah dicadangkan, yang membolehkan anda menentukan bahawa kekunci dalam tatasusunan disusun mengikut urutan peningkatan nilai berangka, bermula dari 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); // salah
  • Для Π·Π°ΠΏΡ€Π΅Ρ‚Π° пСрСопрСдСлСния констант Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Β«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 }
  • Fungsi fsync dan fdatasync dicadangkan untuk memaksa perubahan disimpan daripada cache cakera. $file = fopen("sample.txt", "w"); fwrite($file, "Sesetengah kandungan"); if (fsync($file)) { echo "Fail telah berjaya dikekalkan ke cakera."; } fclose($file);
  • Menambah keupayaan untuk menggunakan awalan "0o" dan "0O" untuk nombor perlapanan, sebagai tambahan kepada awalan "0" yang digunakan sebelum ini. 016 === 0o16; // benar 016 === 0O16; // benar
  • Adalah dicadangkan untuk mengehadkan penggunaan $GLOBALS secara terpilih, yang akan membawa kepada pelanggaran keserasian ke belakang, tetapi akan memungkinkan untuk mempercepatkan operasi dengan tatasusunan dengan ketara. Sebagai contoh, kemungkinan untuk melumpuhkan penulisan kepada $GLOBALS dan menghantar $GLOBALS melalui penunjuk sedang dipertimbangkan. Analisis terhadap 2000 pakej menunjukkan bahawa hanya 23 daripadanya akan terjejas oleh perubahan ini. Sebagai contoh, jika cadangan itu diluluskan, 8.1 tidak lagi akan menyokong ungkapan seperti: $GLOBALS = []; $GLOBALS += []; $GLOBAL =& $x; $x =& $GLOBAL; unset($GLOBALS); by_ref($GLOBALS);
  • Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Π’ PHP 8.1 ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ°, Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ объявлСнию Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π½ΠΎ Π² PHP 9.0 ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ.
  • Kerja diteruskan untuk memindahkan fungsi daripada menggunakan sumber kepada memanipulasi objek. Fungsi finfo_* dan imap_* telah dipindahkan ke objek.
  • Menghantar nilai nol sebagai argumen kepada fungsi dalaman yang ditandakan tidak boleh dibatalkan telah ditamatkan. Dalam PHP 8.1, menggunakan binaan seperti str_contains("string", null) akan membawa kepada amaran, dan dalam PHP 9 kepada ralat.
  • Menambah sokongan untuk algoritma pencincangan MurmurHash3 dan xxHash.

Sumber: opennet.ru

Tambah komen