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 issetatau emptydi 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 $baratau $bazditetapkan dalam fungsi karena Anda hanya mengatur mereka, semua yang perlu Anda khawatir tentang adalah jika nilai mengevaluasi mereka untuk trueatau 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 !issetmasalah, 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 nulltetapi '', 0, '0', falseatau sesuatu seperti itu, yaitu nilai yang Anda dapat mengevaluasi dengan issetatau empty, tergantung pada niat Anda. Jika Anda secara teratur menyetel kunci array ke nulldan ingin artinya tidak berarti apa pun false, yaitu jika dalam contoh di atas hasil yang berbeda issetdan array_key_existsmembuat 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/ falseflag, maka gunakantrueatau . 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 , bukannullnullnull