Setelah satu tahun pengembangan, rilis bahasa pemrograman PHP 8.1 dipresentasikan. Cabang baru ini mencakup serangkaian fitur baru, serta beberapa perubahan yang merusak kompatibilitas.
Peningkatan utama dalam PHP 8.1:
- Menambahkan dukungan untuk enumerasi, misalnya, Anda sekarang dapat menggunakan konstruksi berikut: enum Status { case Pending; kasus Aktif; kasus Diarsipkan; } class Posting { fungsi publik __konstruksi( Status pribadi $status = Status::Tertunda; ) {} fungsi publik setStatus(Status $status): void { // β¦ } } $post->setStatus(Status::Aktif);
- Dukungan tambahan untuk thread ringan yang disebut fiber, yang memungkinkan manajemen thread tingkat rendah. Dukungan fiber direncanakan untuk framework Amphp dan ReactPHP. $fiber = new Fiber(function()): void { $valueAfterResuming = Fiber::suspend('setelah penangguhan'); // β¦ }); $valueAfterSuspending = $fiber->start(); $fiber->resume('setelah melanjutkan');
- Π£Π»ΡΡΡΠ΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (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 array "...$var", yang memungkinkan substitusi array yang ada saat mendefinisikan array baru, telah diperluas untuk mendukung kunci string (sebelumnya hanya pengidentifikasi digital yang didukung). Misalnya, Anda sekarang dapat menggunakan kode: $array1 = [βaβ => 1]; $array2 = ["b" => 2]; $array = [βaβ => 0, β¦$array1, β¦$array2]; var_dump($array); //["a" => 1, "b" => 2]
- Kata kunci "baru" diperbolehkan dalam inisialisasi, seperti dalam definisi fungsi sebagai parameter default atau dalam atribut argumen. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
- Sekarang memungkinkan untuk menandai properti kelas untuk akses baca-saja (informasi dalam properti tersebut hanya dapat ditulis satu kali, setelah itu tidak akan tersedia untuk modifikasi). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* β¦ */); $post->title = 'Other'; > Error: Tidak dapat memodifikasi properti baca-saja Post::$title
- Sintaks baru untuk objek yang dapat dipanggil telah diterapkan - penutupan sekarang dapat dibentuk dengan memanggil fungsi dan memberikan nilai "..." sebagai argumen (misalnya myFunc(...) alih-alih Closure::fromCallable('myFunc')): function foo(int $a, int $b) { /* ... */ } $foo = foo(...); $foo(a: 1, b: 2);
- Dukungan penuh untuk tipe interseksi telah ditambahkan, memungkinkan Anda membuat tipe baru dengan menggabungkan tipe yang sudah ada. Tidak seperti tipe gabungan, yang mendefinisikan koleksi dua tipe atau lebih, tipe interseksi mengharuskan semua tipe yang ditentukan ada dalam set yang diisi, bukan hanya salah satu tipe yang terdaftar. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
- Ada tipe baru "tidak pernah" yang dapat digunakan untuk memberi tahu penganalisis statis bahwa suatu fungsi akan menghentikan eksekusi program, misalnya dengan melemparkan pengecualian atau menjalankan fungsi keluar. fungsi dd(campuran $input): tidak pernah { keluar; }
- Fungsi baru array_is_list telah diusulkan, yang memungkinkan Anda menentukan bahwa kunci dalam array disusun berdasarkan kenaikan nilai numerik, mulai dari 0: $list = [βaβ, βbβ, βcβ]; array_is_list($daftar); // benar $notAList = [1 => βaβ, 2 => βbβ, 3 => βcβ]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // PALSU
- Anda sekarang dapat menggunakan kata kunci "final" untuk mencegah penggantian konstanta dari kelas induk. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Fatal error: Bar::X tidak dapat mengganti konstanta final Foo::X }
- Fungsi fsync dan fdatasync diusulkan untuk memaksa perubahan disimpan dari cache disk. $file = fopen("sample.txt", "w"); fwrite($file, "Beberapa konten"); if (fsync($file)) { echo "File telah berhasil disimpan ke disk."; } fclose($file);
- Menambahkan kemampuan untuk menggunakan awalan "0o" dan "0O" untuk bilangan oktal, selain awalan "0" yang digunakan sebelumnya. 016 === 0o16; // benar 016 === 0O16; // BENAR
- Diusulkan untuk membatasi penggunaan $GLOBALS secara selektif, yang akan mengakibatkan pelanggaran kompatibilitas ke belakang, namun akan memungkinkan untuk mempercepat operasi dengan array secara signifikan. Misalnya, kemungkinan menonaktifkan penulisan ke $GLOBALS dan meneruskan $GLOBALS dengan penunjuk sedang dipertimbangkan. Analisis terhadap 2000 paket menunjukkan bahwa hanya 23 paket yang akan terkena dampak perubahan ini. Misalnya, jika proposal disetujui, 8.1 tidak lagi mendukung ekspresi seperti: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBAL; tidak disetel($GLOBALS); by_ref($GLOBALS);
- Metode internal sekarang harus mengembalikan tipe yang benar. Di PHP 8.1, mengembalikan tipe yang tidak sesuai dengan deklarasi fungsi akan menghasilkan peringatan, tetapi di PHP 9.0, peringatan ini akan digantikan dengan kesalahan.
- Pekerjaan dilanjutkan pada pengalihan fungsi dari penggunaan sumber daya ke manipulasi objek. Fungsi finfo_* dan imap_* telah ditransfer ke objek.
- Meneruskan nilai null sebagai argumen ke fungsi internal yang ditandai non-nullable sudah tidak digunakan lagi. Di PHP 8.1, penggunaan konstruksi seperti str_contains("string", null) akan menghasilkan peringatan, dan di PHP 9 menyebabkan kesalahan.
- Menambahkan dukungan untuk algoritma hashing MurmurHash3 dan xxHash.
Sumber: opennet.ru
