Skip to content

emka.web.id

Menu
  • Home
  • Indeks Artikel
  • Tutorial
  • Tentang Kami
Menu

Apa yang Baru di PHP 8.2?

Posted on December 15, 2022 by Syauqi Wiryahasana
PHP 8.2 dirilis pada Desember 2022 sebagai versi minor terbaru dalam siklus rilis PHP 8.x. Itu menambahkan fitur baru yang dibangun di atas kemampuan versi sebelumnya, lebih menyederhanakan pengalaman pengembangan. Dalam artikel ini, kita akan meninjau setiap perubahan besar dan menunjukkan bagaimana mereka akan membuat kode Anda lebih mudah dipelihara. Peningkatan Sistem Type PHP telah secara bertahap mengembangkan sistem tipenya menuju model yang diketik lebih kuat selama beberapa rilis terakhir. 8.2 menyertakan dua peningkatan yang memungkinkan tipe menjadi lebih ekspresif.

Disjunctive Normal Form: Combined Unions and Intersections

Union dan tipe interseksi sekarang dapat digabungkan di mana pun tipe diterima, seperti parameter fungsi dan nilai kembalian. Definisi tipe lengkap harus ditulis menggunakan boolean disjunctive normal form notation (DNF). Ini berarti tipe persimpangan harus dibungkus dengan tanda kurung agar valid. Fungsi berikut memungkinkan Anda untuk melewatkan array, atau objek yang mengimplementasikan antarmuka Countable dan Iterator: function foo((Countable&Iterator)|array$values): void {// ...} Ini memfasilitasi definisi jenis yang lebih canggih, mirip dengan contoh fungsi yang ditampilkan di atas. Sebelum PHP 8.2, Anda harus menulis dua fungsi terpisah untuk mencapai efek yang sama, satu untuk masing-masing tipe di union.

Standalone Types for Null and Booleans

Nilai true, false, dan null sekarang diterima sebagai tipe standalone. Mereka bisa digunakan dalam definisi tipe apa pun untuk menunjukkan bahwa nilai tertentu akan dikembalikan: function alwaysReturnsTrue():true{} function alwaysReturnsFalse():false{} function alwaysReturnsNull():null{} Dalam kasus penggunaan realistis, Anda akan biasanya menulis nilai-nilai ini sebagai bagian dari tipe gabungan. Penanganan error dengan mengembalikan false alih-alih nilai reguler adalah pola umum di kode PHP inti dan userland, misalnya. Sekarang Anda dapat menjelaskan perilaku ini dengan benar dalam definisi tipe pengembalian Anda: /** * Mencoba terhubung ke database; mengembalikan `false` pada kegagalan */function connectToDatabase(): DatabaseConnection|false; /** * Mencoba untuk menutup koneksi database; mengembalikan kode kesalahan pada kegagalan */function closeDatabaseConnection():true|DatabaseErrorCode;Readonly Classes Properti readonly adalah salah satu fitur utama PHP 8.1. Mereka membiarkan Anda memberlakukan kekekalan untuk properti kelas setelah penugasan awal mereka: final class User { publicfunction __construct( public readonly string $Username, public readonly bool $Admin){} } $user=new User( Username:"howtogeek", Admin:true ); // Error - Properti ini readonly$user->Username="Demo"; Dalam praktiknya, banyak kelas ingin semua propertinya hanya dibaca. Sekarang Anda bisa menandai seluruh kelas sebagai readonly, yang memungkinkan Anda menghilangkan kata kunci readonly dari properti individual. readonly final class User { publicfunction __construct( public string $Username, public bool $Admin){} } $user=new User( Username :"howtogeek", Admin:true); // Error - Properti adalah readonly$user->Username="Demo"; Selain menyimpan beberapa pengetikan berulang, membuat kelas readonly menambahkan beberapa batasan lain: Anda tidak dapat menambahkan properti yang tidak diketik ke kelas. Properti yang tidak diketik tidak didukung sebagai properti readonly, yang mana kelas readonly adalah gula sintaksis. Kelas juga tidak dapat berisi properti statis, karena ini juga tidak kompatibel dengan kata kunci readonly. Kelas tidak dapat diperluas oleh turunan non-readonly. Pewarisan diizinkan jika turunan juga menyertakan kata kunci readonly.Properti dinamis tidak dapat dibuat pada instance kelas dan atribut AllowDynamicProperties diblokir agar tidak menimpa class this. Readonly membuatnya lebih nyaman untuk menulis objek transfer data dan struktur lain yang dimaksudkan untuk menjadi abadi. Namun penggunaannya tidak wajib: Anda masih dapat membuat kelas yang dapat diubah sebagian dengan terus menggunakan kata kunci readonly pada properti individual. Properti

Enum Dapat Dikonsumsi Dalam Ekspresi KonstanProperti

Enum sekarang dapat digunakan dalam ekspresi konstan. Kode berikut, yang tidak didukung dalam versi enum yang disertakan dengan PHP 8.1, kini legal: enum PostStatus : int { case Draft =1; kasus Diterbitkan =2; const VALUES =[self::Published->value=>self::Published]; } Properti value dari kasus Published enum diakses tanpa menimbulkan kesalahan, karena mesin PHP sadar bahwa nilainya tidak akan pernah berubah.

Traits Can Define Constants

Sekarang dimungkinkan untuk menentukan konstanta, sesuatu yang dihilangkan dari rilis PHP sebelumnya. Setiap konstanta yang ditulis dalam suatu sifat akan terlihat dalam lingkup kelas yang menggunakannya. Contoh ini menunjukkan kemungkinan untuk mengakses konstanta suatu sifat, dalam kode sifat, kode kelas yang menggunakannya, dan dari lingkup global : trait Loggable { publicconst LOG_TYPE_JSON =1; publicfunctionlog(string $message): void {if($this->getLogType()===self::LOG_TYPE_JSON){// ...}} abstractpublicfunction getLogType(): int; } kelas akhir NewUserEvent { gunakan Loggable; publicfunction getLogType(): int {returnself::LOG_TYPE_JSON;} } // "1"echo NewUserEvent::LOG_TYPE_JSON; Perhatikan bahwa Anda tidak dapat mengakses nilai konstanta secara langsung pada sifat, dari cakupan global. Kode berikut akan menampilkan kesalahan "konstanta sifat tidak dapat diakses secara langsung": echo Loggable::LOG_TYPE_JSON;Pendekatan Berorientasi Objek Modern ke Angka Acak PHP 8.2 menambahkan ekstensi pembuatan nomor acak berorientasi objek baru. Ini memungkinkan Anda menghasilkan angka acak menggunakan beberapa mesin generasi modern. Contoh ini menunjukkan cara menghasilkan bilangan bulat acak antara 1 dan 100 dengan xoshiro256** engine: use RandomEngineXoshiro256StarStar;use RandomRandomizer; $randomizer=Pengacak baru(Xoshiro256StarStarbaru(hash( algo:"sha256", data:"nilai benih 256-bit", biner:benar))); /** Dihasilkan dengan xoshiro256** */echo$randomizer->getInt(1.100); Jika Anda kemudian ingin beralih ke mesin lain, Anda hanya perlu mengganti parameter yang diteruskan ke instance Randomizer Anda: use RandomEngineMt19937 ;gunakan AcakPengacak; $pengacak=Pengacak baru(Mt19937 baru(1234)); /** Dihasilkan dengan Mt19937 */echo$randomizer->getInt(1,100);Prevent Passwords Leaking into Stack Traces and Error Logs Code seperti berikut adalah fitur standar di banyak basis kode PHP: function connectToDatabase( string $host, int $port, string $username, string $password): void {// ...} Ini menimbulkan tantangan saat fungsi melontarkan pengecualian yang tidak tertangkap. Pelacakan tumpukan PHP menyertakan nilai parameter fungsi, sehingga kata sandi akhirnya dipancarkan ke log kesalahan Anda. Ini adalah risiko keamanan. PHP 8.2 mengatasi masalah tersebut dengan menyediakan atribut baru yang menandai parameter sebagai “sensitif”. Menerapkan atribut #[SensitiveParameter] ke parameter apa pun akan mengurangi nilainya dari pelacakan tumpukan: function connectToDatabase( string $host, int $port, string $username,#[SensitiveParameter] string $password): void {// .. .} Pelacakan tumpukan yang dimodifikasi akan tampak seperti berikut ini: Pelacakan tumpukan: #0 index.php(1): connectToDatabase("localhost", "3306", "demo", Object(SensitiveParameterValue)) #1 {main} It akan bermanfaat mengaudit basis kode Anda untuk menemukan parameter dengan nilai sensitif setelah Anda memutakhirkan. Tambahkan atribut ke setiap instance yang Anda temukan. Ini akan membantu mencegah log yang bocor membahayakan keamanan lingkungan Anda. Properti Kelas Dinamis

Telah Tidak Digunakan Lagi

PHP secara historis memungkinkan Anda menyetel properti pada instance objek tanpa terlebih dahulu mendeklarasikannya: final class User {} $user=new User();$user-> Username="howtogeek"; Perilaku ini sering bermasalah. Baik Anda maupun alat analisis statis otomatis tidak dapat menyatakan properti mana yang akan dimiliki oleh instance. Properti Dynamic juga memfasilitasi kesalahan ketik yang sulit dikenali: final class User { public string $Username; } $user=new User();$user->Usernamee="howtogeek"; Anda salah menyetel properti Usernamee, tetapi PHP tidak akan memberikan kesalahan atau memberikan bantuan apa pun. Ini menyebabkan Anda menghabiskan waktu untuk men-debug mengapa properti Username yang benar tidak memiliki nilai yang Anda harapkan. PHP 8.2 mengatasi masalah ini dengan menghentikan properti dinamis. Selanjutnya, Anda harus mendefinisikan semua properti yang dapat diterima kelas, baik secara individual atau sebagai properti konstruktor yang dipromosikan. Karena ini adalah penghentian dan bukan penghapusan, kode yang ada akan terus berfungsi untuk saat ini. Pemberitahuan penghentian akan dicatat setiap kali properti dinamis dibaca atau disetel. Penghapusan, yang dapat terjadi di PHP 9.0, akan menjadi perubahan besar. Setiap kode yang bergantung pada properti dinamis akan berhenti bekerja. Namun, ada cara untuk terus menggunakan properti dinamis. Anda dapat secara eksplisit menyertakan kelas ke properti dinamis dengan menandainya dengan atribut #[AllowDynamicProperties] yang baru. Ini akan terus berfungsi di PHP 9.0 juga. Ini memecahkan beberapa kasus penggunaan yang sah untuk properti dinamis, seperti toko konfigurasi, dan peta sementara dan cache. #[AllowDynamicProperties] final class ConfigStore {} $store=new ConfigStore();$settings=json_decode(file_get_contents(__DIR__ ."/settings.json"),true); foreach($settingsas$key=>$value){$store->$key=$value;} Penggunaan atribut ini sebaiknya tidak disarankan kecuali dalam kasus yang mirip dengan contoh ini, di mana kelas bersifat dinamis. Penghentian properti dinamis dimaksudkan untuk membantu Anda menulis kode yang lebih aman dan tidak terlalu rentan terhadap kesalahan. Perubahan ini tidak memengaruhi kelas yang menggunakan metode ajaib __get() dan __set() . Mereka akan terus berfungsi seperti biasa, memungkinkan Anda menerapkan rutinitas Anda sendiri saat properti yang tidak ditentukan dibaca atau disetel. Contoh stdClass() juga terus mendukung properti dinamis.

Summary

PHP 8.2 adalah rilis baru yang menarik untuk peningkatan kegunaan. Ini mencakup kelas baca yang menghemat waktu, definisi tipe yang lebih fleksibel, dan penyesuaian kecil yang meningkatkan pengalaman pengembang, seperti konstanta dalam sifat, nilai enum dalam ekspresi konstanta, dan redaksi nilai parameter sensitif untuk pelacakan tumpukan. Pemutakhiran kini tersedia di semua saluran distribusi PHP yang didukung. Pindah ke 8.2 seharusnya mudah untuk sebagian besar basis kode modern yang sudah ditulis menggunakan fitur dan standar PHP 8.x. Namun, ada beberapa jeda kompatibilitas mundur yang sempit yang harus diperhatikan, jadi lihat panduan migrasi resmi untuk mempelajari tentang semua perubahan dan apa yang harus Anda lakukan untuk mempersiapkannya. Disadur dari HowToGeek.com.
Seedbacklink

Recent Posts

TENTANG EMKA.WEB>ID

EMKA.WEB.ID adalah blog seputar teknologi informasi, edukasi dan ke-NU-an yang hadir sejak tahun 2011. Kontak: kontak@emka.web.id.

©2024 emka.web.id Proudly powered by wpStatically