Pertimbangkan kode berikut, di mana setter sengaja rusak karena kesalahan pemrograman biasa yang telah saya buat nyata beberapa kali di masa lalu:
<?php
class TestClass {
private $testField;
function setField($newVal) {
$testField = $newVal;
// deliberately broken; should be `$this->testField = $newVal`
}
function getField() {
return $this->testField;
}
}
$testInstance = new TestClass();
$testInstance->setField("Hello world!");
// Actually prints nothing; getField() returns null
echo $testInstance->getField();
?>
Fakta bahwa saya menyatakan $testField
di bagian atas kelas membantu menyembunyikan kesalahan pemrograman itu dari saya. Jika saya tidak mendeklarasikan bidang, maka saya akan mendapatkan sesuatu yang mirip dengan peringatan berikut yang dicetak ke log kesalahan saya setelah memanggil skrip ini, yang berpotensi berguna untuk membantu debugging saya - terutama jika saya membuat kesalahan seperti ini di aplikasi dunia nyata yang besar dan rumit:
Pemberitahuan PHP: Properti tidak terdefinisi: TestClass :: $ testField di /var/www/test.php on line 13
Dengan deklarasi itu, tidak ada peringatan.
Mungkin saya kehilangan sesuatu, tetapi saya menyadari hanya dua alasan untuk mendeklarasikan bidang kelas di PHP: pertama, bahwa deklarasi bertindak sebagai dokumentasi, dan kedua, bahwa tanpa deklarasi, seseorang tidak dapat menggunakan private
dan protected
mengakses pengubah, yang merupakan bisa dibilang bermanfaat. Karena argumen yang terakhir tidak berlaku untuk bidang publik - menugaskan ke bidang yang tidak dideklarasikan dari suatu objek menjadikannya publik - menurut saya setidaknya saya harus mengomentari semua deklarasi bidang publik saya. Komentar akan memberikan nilai dokumentasi yang persis sama, tetapi saya akan mendapat manfaat dari peringatan jika saya mencoba membaca bidang yang tidak diinisialisasi.
Namun, setelah dipikirkan lebih lanjut, tampaknya tidak masuk akal untuk berhenti di situ. Karena dalam pengalaman saya mencoba membaca bidang yang tidak diinisialisasi adalah penyebab kesalahan yang jauh lebih umum daripada mencoba membaca secara tidak tepat atau memodifikasi bidang pribadi atau yang dilindungi (saya sudah melakukan yang sebelumnya beberapa kali dalam karir pemrograman singkat saya, tetapi tidak pernah yang terakhir ), bagi saya sepertinya mengomentari semua deklarasi lapangan - bukan hanya yang umum - akan menjadi praktik terbaik.
Yang membuat saya ragu adalah bahwa saya belum pernah melihat orang lain melakukannya dalam kode mereka. Kenapa tidak? Apakah ada manfaat untuk mendeklarasikan bidang kelas yang tidak saya ketahui? Atau bisakah saya memodifikasi konfigurasi PHP dengan beberapa cara untuk mengubah perilaku deklarasi lapangan sehingga saya bisa menggunakan deklarasi lapangan nyata dan masih mendapat manfaat dari peringatan "Properti tidak terdefinisi"? Atau ada hal lain yang saya lewatkan dalam analisis saya?
TRUE === $variable
untuk mencegah diri Anda menetapkan secara tidak sengaja alih-alih membandingkan.Jawaban:
Anda harus selalu mendeklarasikan properti kelas Anda sebelumnya. Meskipun PHP adalah bahasa yang dinamis dan dengan senang hati akan berjalan seiring dengan Anda membuat properti Anda saat runtime, ada beberapa kelemahan pada jalur ini.
Masalah yang Anda uraikan sebenarnya masalah kecil jika dibandingkan dengan masalah tidak mendeklarasikan properti Anda dalam definisi kelas Anda. Ini solusi yang bagus.
Biasakan mendeklarasikan default untuk properti Anda.
Kecuali untuk properti yang akan menyimpan objek, ini akan mencakup sebagian besar tipe dasar yang akan Anda simpan. Properti yang akan menyimpan objek dapat diatur di konstruktor Anda.
Aturan yang baik untuk desain kelas adalah bahwa setelah objek Anda telah dibuat dan konstruktor Anda telah berjalan, Anda seharusnya tidak memiliki properti di luar sana "tidak terdefinisi".
sumber
Saya bekerja pada beberapa kode yang menggunakan properti objek yang dibuat secara dinamis. Saya pikir menggunakan properti objek yang dibuat secara dinamis cukup keren (benar, menurut saya). Namun, program saya butuh 7 detik untuk berjalan. Saya menghapus properti objek dinamis dan menggantinya properti objek yang dinyatakan sebagai bagian dari setiap kelas (publik dalam kasus ini). Waktu CPU berubah dari 7 detik menjadi 0,177 detik. Itu cukup besar.
Mungkin saja saya melakukan sesuatu yang salah dengan cara saya menggunakan properti objek dinamis. Mungkin juga konfigurasi saya rusak. Tentu saja, saya harus mengatakan bahwa saya memiliki konfigurasi PHP vanilla yang sangat sederhana di komputer saya.
sumber