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');
- Implementasi cache kode objek (opcache) telah ditingkatkan, menambahkan kemampuan untuk menyimpan informasi pewarisan kelas dalam cache. Optimalisasi ini telah meningkatkan kinerja beberapa aplikasi sebesar 5-8%. Optimalisasi lainnya meliputi optimalisasi JIT, dukungan JIT untuk arsitektur ARM64 (AArch64), akselerasi resolusi nama, optimalisasi pustaka timelib dan ext/date, peningkatan kinerja serialisasi dan deserialisasi, serta optimalisasi fungsi get_declared_classes(), explode(), strtr(), strnatcmp(), dan dechex(). Secara keseluruhan, kinerja telah meningkat sebesar 23.0% untuk Symfony Demo dan sebesar 3.5% untuk WordPress.
- 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
