Di PHP 8, kami menggunakan kelas, properti, dan konstanta kelas, metode, fungsi, parameter untuk mengakses atribut Show Di PHP 8, Reflection API mengirimkan metode getAttribute() pada setiap objek Reflection yang cocok Metode getAttribute() mengembalikan array ilustrasi ReflectionAttribute yang dapat diminta untuk nama atribut, argumen, dan untuk membuat instance dari atribut yang ditandai Ini terdengar seperti pertanyaan wawancara yang sepele, kami tahu. Anda dapat dengan mudah menemukan metode yang terdokumentasi dengan baik dengan Refleksi. Beberapa guru sejati bahkan memberi kami cara non-Refleksi lainnya untuk melakukan hal yang sama. Namun, saat Anda mulai mengimplementasikannya sendiri, Anda dapat mengalami banyak masalah tak terduga dan aneh. Ini termasuk, tetapi tidak terbatas pada Anda tidak dapat melakukannya dalam satu baris hanya dengan menggunakan RefleksiAnda harus bermain-main dengan objek API Refleksi, tetapi jangan berani-berani lupa menelepon Itu benar. jika Anda mencoba mengakses properti pribadi yang diwariskan dari kelas induk, potongan kode Stackoverflow yang disetujui akan gagal Mengakses privat orang tua gagal di PHPSaya yakin ada penjelasan akademis yang masuk akal untuk perilaku ini. Jika Anda tahu alasannya, silakan bagikan dengan kami di komentar. Mungkin sesuatu seperti
Kita bisa melihat sedikit perbedaan pada pesan error PHP pada screenshot dari 3v4l. org. alih-alih “Properti p tidak ada” kita mendapatkan “Properti Anak. $p tidak ada”. Ini menyiratkan bahwa properti kelas induk bahkan tidak dilihat Jika Anda memikirkannya, Anda tidak dapat mengakses properti pribadi orang tua Anda sebagai seorang anak, jadi itu masuk akal Terlepas dari semua lelucon, bagaimana kita bisa membaca properti pribadi suatu objek di PHP? . php-refleksi. Mari kita lihat sebuah contoh PHP 7. 4 akhirnya membawa properti yang diketik. Ini adalah fitur yang saya nantikan, dan saya telah menghabiskan waktu berkualitas mengerjakan proyek saya yang sudah ada untuk menambahkan dukungan untuk properti yang diketik Dengan properti yang diketik, Anda dapat mengatur tipe untuk semua properti kelas. Saat tipe disetel, mesin PHP mencegah siapa pun menyetel tipe yang berbeda ke properti kelas
Cuplikan di atas akan memastikan bahwa properti _7 akan selalu menjadi objek 8. Sebelum PHP7. 4, pola data ketat semacam ini harus memiliki 9 dan 0 metode untuk menegakkan integritas dataJenis properti yang didukungJenis yang didukung untuk properti kelas
Di sinilah sebagian besar penarikan rambut mungkin terjadi. Dengan PHP7. 4 properti yang diketik, properti kelas memiliki status yang tidak diinisialisasi. Ini berarti bahwa properti belum diinisialisasi. Ini tidak sama dengan _8Jika tidak ada tipe yang dideklarasikan, properti memiliki 8 sebagai nilai yang tidak diinisialisasi _Saat sebuah tipe dideklarasikan, semua properti akan memiliki status yang tidak diinisialisasi. Tidak diperbolehkan mengakses properti kelas sebelum menetapkan nilai eksplisit _Dalam cuplikan ini, properti _0 tidak diinisialisasi. Ini tidak sama dengan _8, dan cuplikan di atas akan menimbulkan kesalahan
Periksa status yang tidak diinisialisasiAnda dapat memeriksa apakah properti kelas tidak diinisialisasi menggunakan 2. Karena nilai ini tidak sama dengan 8, Anda tidak dapat menggunakan 4 untuk memeriksa apakah properti tidak diinisialisasiSetel ulang properti ke status tidak diinisialisasiUntuk mengatur ulang properti kembali ke keadaan tidak diinisialisasi, gunakan 5. Setelah tidak disetel, mencoba mengakses properti tanpa menetapkan nilainya akan menimbulkan kesalahan 6 yang samaJenis yang dapat dibatalkanMirip dengan PHP7. 1's nullable type, tipe properti juga dapat ditandai nullable. Untuk menandai properti bisa menjadi nol, awali jenisnya dengan tanda tanya, mis. g. _7
Bahkan jika sebuah properti ditandai nullable, nilainya yang tidak diinisialisasi tidak akan menjadi 8. Misalnya, cuplikan di bawah ini masih akan menimbulkan kesalahan
Meskipun ini tampak rumit untuk dikerjakan, ini memberikan fitur brilian yang dapat Anda yakini bahwa properti kelas akan selalu bertipe seperti itu. Jika nilainya tidak diinisialisasi, PHP akan menyerah dan memunculkan kesalahan alih-alih mengembalikan 8, seperti untuk properti yang tidak diketikJenis yang ketatProperti kelas juga mendukung deklarasi tipe ketat dengan 0 di bagian atas blok file PHP. Tanpa tipe yang ketat, PHP akan memasukkan nilai ke tipe properti
Perhatikan bagaimana kami menyetel _1 ke properti 2, dan panggilan 3 mengembalikan 4 sebagai 2. Saat menetapkan nilai, mesin memberikan nilai ke tipe yang dideklarasikanUntuk meminimalkan masalah dengan tipe juggling dan untuk memanfaatkan sepenuhnya properti yang diketik, saya sarankan Anda menguji kelas Anda dengan 0. Sangat mudah untuk mengabaikan ketika PHP sedang membantu ketika dilemparkan ke tipe untuk Anda, tetapi ini bisa menjadi akar dari beberapa bug di hilir. Lebih mudah untuk men-debug kesalahan yang muncul segera daripada bug yang hanya terjadi pada Jumat malam pukul 6. 28PM, hanya saat DST aktifProperti statis dan referensiProperti statis juga dapat memiliki tipe yang dideklarasikan. Ini mungkin tampak seperti detail yang jelas, tetapi proposal sebelumnya untuk properti yang diketik tidak menyertakan properti statis. Di PHP7. 4, Anda juga dapat mendeklarasikan tipe untuk properti statis Selanjutnya, Anda dapat mengembalikan referensi ke properti yang diketik, dan jenisnya akan tetap dihormati
Ini akan menimbulkan kesalahan
Nilai default dalam konstruktor dan deklarasi propertiUntuk alasan historis, PHP memungkinkan Anda menetapkan nilai default untuk argumen fungsi dalam deklarasinya meskipun jenisnya tidak dapat dibatalkan
Di konstruktor, kami secara eksplisit menandai bahwa 0 argumen tidak dapat dibatalkan, namun PHP menerima 8 sebagai nilai default. Perilaku ini hanya berlaku untuk 8 nilai default. Meskipun secara semantik tidak valid, perilaku ini diperbolehkan karena alasan historis dan implementasiDengan properti yang diketik, ini tidak diperbolehkan _0Ini akan segera menimbulkan kesalahan _1Jenis VariansPHP 7. 4 hadir dengan varian tipe pengembalian, yang berarti kelas anak dapat mengembalikan instance yang lebih spesifik. Ini belum didukung untuk jenis properti. Misalnya _2Kode di atas tidak akan berfungsi. Meskipun 0 adalah subset dari kelas 1, mengubah deklarasi tipe 2 tidak diperbolehkan. Anda masih dapat menetapkan instance 1 ke 2. Ini disebut _5, dan sekarang didukung untuk jenis pengembalianMencoba hal di atas akan menimbulkan kesalahan seperti berikut _3Kode berikut ini masih valid _4Perhatikan bagaimana deklarasi properti di _6 dan 2 adalah 1, tetapi kami menetapkan instance 0 untuk ituUntuk meringkas
Untuk memvisualisasikan ini, lihat rantai pewarisan berikut. Tidak satu pun dari hal berikut yang diizinkan _5Di atas akan membuang kesalahan berikut (tidak bersamaan) _6Kompatibilitas mundurMendeklarasikan jenis properti bersifat opsional, dan semua kode Anda yang ada akan berfungsi. Jika Anda berencana untuk memutakhirkan basis kode yang ada ke properti yang diketik, awasi status yang tidak diinisialisasi, dan pewarisan di mana aturan diterapkan dengan agak ketat. Selanjutnya, tipe properti tidak membawa perilaku warisan yang mengizinkan 8 nilai dalam argumen fungsi/metodenya, dan ini bisa mengejutkanPikiran AkhirJenis properti adalah fitur yang secara pribadi membuat saya bersemangat, dan sekarang akhirnya ada di sini, saya telah menghabiskan beberapa waktu menambahkan jenis properti ke proyek pribadi saya yang sudah ada. PHPStorm 2019. 3 hadir dengan dukungan untuk semua PHP 7. 4 fitur, dan ada perbaikan cepat untuk menambahkan jenis properti jika dapat dikumpulkan dari komentar docblock properti atau dari konstruktor Proyek open source mungkin membutuhkan waktu untuk membutuhkan PHP 7. 4 sebagai versi minimum, tetapi itu tidak akan menghalangi Anda untuk menggunakannya dalam proyek pribadi Anda |