Bagi mereka yang tertarik, saya telah memperluas topik ini menjadi artikel kecil, yang memberikan informasi di bawah ini dalam bentuk terstruktur yang agak lebih baik: Panduan Definitif Untuk isset PHP Dan kosong
IMHO Anda harus berpikir tentang tidak hanya membuat aplikasi "E_NOTICE kompatibel", tetapi juga merestrukturisasi semuanya. Memiliki ratusan poin dalam kode Anda yang secara teratur mencoba menggunakan variabel yang tidak ada terdengar seperti program yang terstruktur dengan buruk. Mencoba mengakses variabel yang tidak ada seharusnya tidak pernah terjadi, bahasa lain menolak ini pada waktu kompilasi. Fakta bahwa PHP memungkinkan Anda untuk melakukannya tidak berarti Anda harus melakukannya.
Peringatan ini ada untuk membantu Anda, bukan untuk mengganggu Anda. Jika Anda mendapat peringatan, "Anda mencoba bekerja dengan sesuatu yang tidak ada!" , reaksi Anda seharusnya "Ups, saya buruk, biarkan saya memperbaikinya secepatnya." Bagaimana lagi Anda akan membedakan antara "variabel yang bekerja dengan baik tanpa definisi" dan kode yang benar - benar salah yang dapat menyebabkan kesalahan serius ? Ini juga alasan mengapa Anda selalu, selalu , mengembangkan dengan pelaporan kesalahan berubah menjadi 11 dan terus memasukkan kode Anda sampai tidak ada satu punNOTICE
yang dikeluarkan. Menonaktifkan pelaporan kesalahan hanya untuk lingkungan produksi, untuk menghindari kebocoran informasi dan memberikan pengalaman pengguna yang lebih baik bahkan saat menghadapi kode buggy.
Untuk menguraikan:
Anda akan selalu membutuhkan isset
atau empty
di suatu tempat dalam kode Anda, satu-satunya cara untuk mengurangi kemunculannya adalah dengan menginisialisasi variabel Anda dengan benar. Bergantung pada situasinya, ada berbagai cara untuk melakukannya:
Argumen fungsi:
function foo ($bar, $baz = null) { ... }
Tidak perlu untuk memeriksa apakah $bar
atau $baz
ditetapkan dalam fungsi karena Anda hanya mengatur mereka, semua yang perlu Anda khawatir tentang adalah jika nilai mengevaluasi mereka untuk true
atau false
(atau apapun yang lain).
Variabel biasa di mana saja:
$foo = null;
$bar = $baz = 'default value';
Inisialisasi variabel Anda di bagian atas blok kode tempat Anda akan menggunakannya. Ini memecahkan !isset
masalah, memastikan bahwa variabel Anda selalu memiliki nilai default yang diketahui, memberi pembaca gambaran tentang apa yang akan dikerjakan kode berikut dan dengan demikian juga berfungsi sebagai semacam dokumentasi mandiri.
Array:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
Hal yang sama seperti di atas, Anda menginisialisasi array dengan nilai default dan menimpanya dengan nilai aktual.
Dalam kasus yang tersisa, katakanlah template tempat Anda mengeluarkan nilai yang mungkin atau mungkin tidak disetel oleh pengontrol, Anda hanya perlu memeriksa:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Jika Anda sering menggunakannya array_key_exists
, Anda harus mengevaluasi untuk apa Anda menggunakannya. Satu-satunya saat hal itu membuat perbedaan adalah di sini:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Seperti yang dinyatakan di atas, jika Anda menginisialisasi variabel Anda dengan benar, Anda tidak perlu memeriksa apakah kuncinya ada atau tidak, karena Anda tahu itu ada. Jika Anda mendapatkan array dari sumber eksternal, nilai akan kemungkinan besar tidak akan null
tetapi ''
, 0
, '0'
, false
atau sesuatu seperti itu, yaitu nilai yang Anda dapat mengevaluasi dengan isset
atau empty
, tergantung pada niat Anda. Jika Anda secara teratur menyetel kunci array ke null
dan ingin artinya tidak berarti apa pun false
, yaitu jika dalam contoh di atas hasil yang berbeda isset
dan array_key_exists
membuat perbedaan pada logika program Anda, Anda harus bertanya pada diri sendiri mengapa. Keberadaan variabel seharusnya tidak penting, hanya nilainya yang harus menjadi konsekuensinya. Jika kuncinya adalah true
/ false
flag, maka gunakantrue
atau . Satu-satunya pengecualian untuk ini adalah perpustakaan pihak ke-3 yang ingin memiliki arti, tetapi karena sangat sulit untuk dideteksi di PHP, saya belum menemukan perpustakaan apa pun yang melakukan ini.false
, bukannull
null
null