Seperti biasa dengan rilis minor, PHP 8. 2 menambahkan beberapa penghentian. Penghinaan sering menjadi sumber frustrasi, meskipun penting untuk menyadari bahwa mereka sebenarnya sangat membantu. Saya sudah menulis tentang penanganan deprecations secara umum, jadi jika Anda sudah merasa frustasi, mungkin ada baiknya Anda melihat postingan tersebut terlebih dahulu. Hari ini, saya ingin fokus pada satu penghentian khususnya di PHP 8. 2. properti dinamis yang tidak digunakan lagi
Jadi hal pertama yang pertama, apa sebenarnya properti dinamis itu?
Misalnya kelas Post ini tidak memiliki properti name, namun demikian kami menyetelnya saat runtime
class Post { } // … $post = new Post(); $post->name = 'Name'; var_dump($post->name); // 'Name'Mulai dari PHP 8. 2, properti dinamis ini tidak akan digunakan lagi
// … $post->name = 'Name';_Anda akan melihat pesan ini. Deprecated: Creation of dynamic property Post::$name is deprecated
Menerapkan __get dan // … $post->name = 'Name';0 masih berfungsi
Anda mungkin panik saat ini, karena properti dinamis adalah bagian besar dari pemrograman meta di PHP — banyak kerangka kerja mengandalkannya
Tidak perlu khawatir. penghentian baru ini tidak akan memengaruhi kelas apa pun yang mengimplementasikan __get dan // … $post->name = 'Name';0. Kelas yang mengimplementasikan fungsi ajaib ini akan tetap berfungsi sebagaimana mestinya
class Post { private array $properties = []; public function __set(string $name, mixed $value): void { $this->properties[$name] = $value; } // … } // … $post->name = 'Name';_Hal yang sama berlaku untuk objek // … $post->name = 'Name';_3, mereka akan mendukung properti dinamis seperti sebelumnya
$object = new stdClass(); $object->name = 'Name'; // Works fine in PHP 8.2_Sekarang beberapa pembaca yang cerdas mungkin bertanya-tanya. jika // … $post->name = 'Name';3 masih mengizinkan properti dinamis, apa yang akan terjadi jika Anda memperluasnya?
Memang, dimungkinkan untuk memperpanjang dari // … $post->name = 'Name';_3 untuk mencegah pemberitahuan penghentian ditampilkan. Namun, menurut saya solusi ini jauh dari ideal
// Don't do this class Post extends stdClass { } $post = new Post(); $post->name = 'Name'; // Works in PHP 8.2_Apa yang baru di PHP 8. 2
Alternatif yang lebih baik
Jika Anda benar-benar ingin menggunakan properti dinamis tanpa menerapkan __get dan // … $post->name = 'Name';0, ada alternatif yang jauh lebih baik daripada memperluas dari // … $post->name = 'Name';3
Tim inti PHP telah menyediakan atribut bawaan yang disebut // … $post->name = 'Name';9. Seperti namanya, ini memungkinkan properti dinamis di kelas, tanpa harus bergantung pada ekstensi samar
#[\AllowDynamicProperties] class Post { } $post = new Post(); $post->name = 'Name'; // All fineMenutup pikiran
PHP dulunya adalah bahasa yang sangat dinamis, tetapi sekarang telah beralih dari pola pikir itu untuk sementara waktu. Secara pribadi saya pikir itu hal yang baik untuk merangkul aturan yang lebih ketat dan mengandalkan analisis statis sedapat mungkin, karena menurut saya itu mengarah pada penulisan kode yang lebih baik
Saya bisa membayangkan developer yang mengandalkan properti dinamis, yang kurang senang dengan perubahan ini. Jika Anda termasuk dalam grup itu, mungkin berguna untuk melihat lebih dekat ke dalam analisis statis. Anda dapat melihat Road to PHP saya. Seri Analisis Statis jika Anda ingin mempelajari lebih lanjut
Jika Anda bersedia menginvestasikan waktu untuk mencari tahu analisis statis, saya cukup yakin bahwa sebagian besar dari Anda tidak akan pernah ingin kembali ke kekacauan yang merupakan bahasa pemrograman dinamis. Dengan PHP, kami beruntung karena kedua opsi tersedia dan Anda dapat bermigrasi secara bertahap ke sistem tipe yang lebih ketat
Jadi iya. penghentian ini mungkin sedikit menyakitkan, tapi saya percaya itu yang terbaik dari bahasa untuk melakukannya. Dan ingat bahwa itu tidak akan menjadi kesalahan fatal sampai PHP 9. 0, jadi ada banyak waktu untuk menghadapinya
👍
👍
👍 0
Melihat tpyo? . Jika Anda ingin tetap mendapatkan informasi terbaru tentang apa yang terjadi di blog ini, Anda dapat mengikuti saya di Twitter atau berlangganan buletin saya. Email Berlangganan