Selama di stackoverflow, saya melihat masalah ini muncul sepanjang waktu:
- E_NOTICE? == E_DEBUG, menghindari isset () dan @ dengan error_handler yang lebih canggih
- Bagaimana cara mengatur PHP agar tidak memeriksa indeks undefind untuk $ _GET ketika E_NOTICE aktif?
- Cara menghentikan PHP dari mencatat kesalahan Pemberitahuan PHP
- Bagaimana cara mematikan Pemberitahuan PHP 5.3 seperti itu?
Bahkan Pekka (yang menawarkan banyak saran PHP yang solid) telah menabrak E_NOTICE
monster yang ditakuti dan berharap untuk solusi yang lebih baik daripada menggunakan isset()
: isset () dan empty () membuat kode jelek
Secara pribadi, saya menggunakan isset()
dan empty()
di banyak tempat untuk mengelola aliran aplikasi saya. Sebagai contoh:
public function do_something($optional_parameter = NULL) {
if (!empty($optional_parameter)) {
// do optional stuff with the contents of $optional_parameter
}
// do mandatory stuff
}
Bahkan cuplikan sederhana seperti ini:
if (!isset($_REQUEST['form_var'])) {
// something's missing, do something about it.
}
tampaknya sangat logis bagi saya. Itu tidak terlihat seperti mengasapi, sepertinya kode stabil. Tetapi banyak pengembang menjalankan aplikasi mereka dengan E_NOTICE
diaktifkan, menemukan banyak pemberitahuan "indeks array tidak diinisialisasi" yang membuat frustrasi, dan kemudian meringis pada prospek memeriksa variabel yang ditentukan dan "membuang sampah sembarangan" dengan kode mereka isset()
.
Saya menganggap bahasa lain menangani berbagai hal secara berbeda. Berbicara dari pengalaman, JavaScript tidak sesopan PHP. Variabel yang tidak terdefinisi biasanya akan menghentikan eksekusi skrip. Juga, (berbicara dari pengalaman ), saya yakin bahasa seperti C / C ++ hanya akan menolak untuk dikompilasi.
Jadi, apakah pengembang PHP hanya malas? (tidak berbicara tentang Anda, Pekka, saya tahu Anda refactoring aplikasi lama.) Atau apakah bahasa lain menangani variabel tidak terdefinisi lebih anggun daripada mengharuskan programmer untuk memeriksa terlebih dahulu apakah mereka didefinisikan?
(Saya tahu ada E_NOTICE
pesan lain selain variabel yang tidak terdefinisi, tetapi yang tampaknya menjadi yang paling menyebabkan kesulitan)
Tambahan
Dari jawaban sejauh ini, saya bukan satu-satunya yang berpikir isset()
bukan kode mengasapi. Jadi, saya bertanya-tanya sekarang, apakah ada masalah dengan programmer dalam bahasa lain yang menggemakan yang ini? Atau apakah ini semata-mata masalah budaya PHP?
sumber
Jawaban:
Saya kode ke
E_STRICT
dan tidak ada yang lain.Menggunakan cek kosong dan mengeluarkan tidak membuat kode Anda jelek, itu membuat kode Anda lebih bertele-tele. Dalam benak saya apa hal terburuk mutlak yang dapat terjadi dari menggunakannya? Saya mengetik beberapa karakter lagi.
Ayat konsekuensi dari tidak menggunakannya, paling tidak peringatan.
sumber
E_STRICT
. Saya menekan semua kesalahan dalam produksi, tapi itu hanya untuk memastikan tidak ada yang melewati saya dalam pengembangan.E_STRICT
. Tulis kode dan selesaikan semua peringatan dan kesalahan.Saya pikir pemberitahuan tentang elemen yang tidak diketahui adalah kesalahan desain di PHP. Saya tidak yakin itu mungkin untuk memperbaiki kesalahan sekarang, tapi menghasilkan banyak kode boilerplate seperti
if(isset($foo['abc']) && $foo['abc'] == '123')
- kode ini tidak harus memilikiisset
, karena maksud adalah untuk memeriksa apakah ada '123' di tempat tertentu$foo
dan jika tidak ada ada itu jelas bukan '123'. Satu-satunya alasan Anda harus menulis kode dua kali lebih banyak karena kesalahan desain yang tidak menguntungkan ini di PHP. Dan pemberitahuan sangat mahal di PHP, sayangnya, hanya menonaktifkannya bukan pilihan untuk kode di mana kinerja menjadi perhatian.Jadi ya, itu membuat kode IMHO jelek dan itu mengganggu saya. Dan itu bukan karena kurangnya pengalaman - saya menggunakan PHP sejak tahun 1998 dan saya ingat ketika ada
.php3
ekstensi dan itu berarti "itu bukan PHP 2". Mungkin saya malas :) Tapi kemalasan - setidaknya jenis tertentu - adalah kebajikan bagi seorang programmer.Di sisi lain, penggunaan valid
isset
danempty
- sama seperti yang ada di posting asli - baik-baik saja. Saya hanya berpikir PHP terlalu bersemangat tentang peringatan di tempat-tempatisset/empty
yang tidak terlalu dibutuhkan.sumber
$eg = isset($_GET['eg'])? $_GET['eg'] : null;
bertele-tele. Saya benar-benar berharap ada operator lain yang bukan "penindas kesalahan" semata-mata untuk mendukung makna singkat dari$eg = @$_GET['eg'];
"accept-the-non-exist-of-this-array-key-as-a-null". Saya cenderung menggunakan fungsi pendek, hari ini.$eg = $_GET['eg'] ?? null;
$eg = @$_GET['eg'] ?: null;
. Saya biasanya tidak menggunakannya, tetapi dalam hal ini kami secara eksplisit mengharapkan kesalahan itu dan memutuskan untuk mengabaikannya. Ini satu karakter lebih lama dari nol menyatu dan itu tidak sebagus (itu menekan semua kesalahan, dan mungkin ada ArrayAccess melakukan hal-hal yang funky di sana, bukan hanya array), tetapi secara umum melakukan pekerjaan.Saya percaya PHP, sebagai bahasa bebas, yang ditafsirkan dan digunakan di web, memiliki proporsi yang sangat tinggi dari pembuat kode yang tidak profesional dan tidak terlatih yang tidak sepenuhnya menyadari mengapa mereka harus membuat kode pertahanan dan hanya melihat peringatan sebagai kesalahan lain yang tidak perlu. .
Saya mendengar poin-poin ini dari pengembang junior dan script-coders otodidak sepanjang waktu:
Jika mereka tidak pernah mengalami bahasa yang sangat diketik, atau mengalami jebakan variabel yang tidak dideklarasikan / tidak terinstalasi, maka mereka mengambil beberapa meyakinkan. Saya menemukan mereka biasanya menyerah begitu mereka telah mengalami kenikmatan kode debug selama satu jam atau lebih untuk menemukan itu kesalahan ketik pada nama variabel yang menyebabkan masalah.
Faktor kuat lainnya adalah penggunaan PHP dalam industri web, yang cenderung lebih mementingkan throughput daripada keamanan dan kualitas kode.
sumber
Ya, mereka malas. Banyak dari mereka ...
Sayangnya mentalitas banyak pembuat kode PHP adalah "Tidak ada titik pengkodean defensif jika Anda bisa mendapatkan hasil akhir yang sama lebih cepat dengan mengandalkan bahasa untuk menangani kesalahan yang disebabkan oleh variabel yang hilang dll." Saya tahu, saya telah bekerja dengan beberapa dari mereka.
Mereka cenderung juga menjadi orang-orang yang secara misterius menuju makan siang lebih awal ketika kurangnya penanganan dan pelaporan kesalahan yang benar membuat server langsung selama beberapa jam ...
sumber
Saya mencoba untuk menghindari penggunaan isset () dan empty () dengan menghindari penggunaan array sebagai objek transfer data. Buat kelas yang dapat dikonfigurasi untuk menerima set properti terbatas dengan default waras dan validasi input ke properti itu. Ia bahkan dapat mengimplementasikan antarmuka ArrayAccess sehingga Anda dapat menggunakannya seperti array. Ini juga memungkinkan Anda untuk menggunakan petunjuk tipe dalam tanda tangan metode Anda untuk menangkap kesalahan ketika seseorang mencoba untuk melewati jenis entitas yang salah ke metode Anda.
sumber
Banyak pengembang salah mengira kehadiran banyak
isset()
sebagai tanda kualitas. Ini memberikan tampilan keandalan dan beberapa orang menganggapnya bahkan sebagai fitur keamanan.Tetapi Anda harus mempertimbangkan bahwa PHP bukan bahasa yang dikompilasi. Ini adalah bahasa scripting dengan sistem tipe dinamis. Kesalahan E_NOTICE hanya kesalahan berdasarkan nama. Dan jika banyak
isset
digunakan dengan tujuan menekan pemberitahuan, maka Anda sebenarnya hanya coding terhadap bahasa .Memang demikian halnya jika Anda melihat banyak pemberitahuan dan peringatan dilemparkan. Banyak pemula tidak peduli tentang pemberitahuan, dan itu biasanya hasil dari orang yang benar-benar cacat
error_reporting(0)
.Namun Anda salah bahwa pengembang lain tidak mengenali E_NOTICE hanya karena mereka tidak @ atau tertekan oleh penerbit. Setidaknya itu adalah niat saya di balik pertanyaan pemberitahuan yang dipertahankan . Mereka bukan sesuatu untuk disingkirkan, tetapi terkadang informasi debug penting.
Seperti semua generalisasi, penggunaan isset yang tidak dipedulikan tidak mengarah pada kode yang optimal. Sangat penting untuk membedakan mana
isset
dan manaempty
yang perlu dan mana yang merupakan garam sintaksis .Tidak, variabel "kesalahan" yang tidak ditentukan bukan masalah PHP saja. Bash, TCL dan Perl atau JavaScript memungkinkan penggunaan variabel yang tidak ditentukan. Fitur bahasa imanen ini tidak terlihat cacat di sana. Ada konstruksi bahasa yang serupa untuk memeriksa nilai yang tidak ditentukan. Namun mereka tidak selalu digunakan seperti dalam PHP, karena nilai undef tidak disalahartikan sebagai "kesalahan".
sumber
Menarik. Saya jarang menggunakan isset (). Kode PHP saya jarang dalam keadaan di mana saya tidak tahu apakah suatu variabel telah ditetapkan di tempat pertama. Setiap variabel GET atau POST yang digunakan diakses melalui fungsi yang akan memberikannya default jika tidak ada. Nilai default dalam panggilan fungsi biasanya secara eksplisit diatur ke 0 atau string kosong.
sumber
Saya menggunakan isset dan mengosongkan banyak. Tapi sebagian besar tempat yang Anda sebutkan, seperti pemrosesan $ _REQUEST, kalau-kalau ada yang mengacaukan parameter. Dalam kasus di mana saya memiliki kendali atas semua variabel yang berkeliaran, saya menemukan bahwa saya biasanya tidak membutuhkannya.
sumber
Saya tidak suka menggunakan isset, tetapi jika ada banyak kode yang dilakukan oleh orang lain, maka itu bisa menjadi anugrah keselamatan. Saya menulis kode wee di bawah ini untuk membantu masalah ini, alih-alih menggunakan isset () isseter ($ a, $ b) akan mengembalikan $ b jika $ a tidak didefinisikan atau kosong, atau fungsi mengembalikan nol. Setiap perbaikan, selamat datang:
sumber