Dengan pelaporan kesalahan aktif, atau bahkan untuk praktik terbaik, saat menghapus variabel dalam PHP, haruskah Anda memeriksa untuk melihat apakah variabel itu ada terlebih dahulu (dalam hal ini tidak selalu ada) dan membatalkannya, atau hanya menghapusnya?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
NOT
digunakanisset
. Lihat jawaban saya. Saya telah melakukan tes untuk menemukan perbedaan kecepatan.Jawaban:
Hapus saja, jika tidak ada, tidak ada yang akan dilakukan.
sumber
if set
mungkin memiliki skema pengindeksan yang lebih baik. (Sebagai contoh, yang sebelumnya mungkin tukang sepatu dan kedua pendekatan menggunakan metode pemeriksaan data yang sama).isset
ayat yang tidak menggunakanisset
.Dari Manual PHP :
sumber
Menggunakan
unset
pada variabel yang tidak ditentukan tidak akan menyebabkan kesalahan apa pun (kecuali variabel tersebut adalah indeks dari larik (atau objek) yang tidak ada).Oleh karena itu, satu-satunya hal yang perlu Anda pertimbangkan, adalah apa yang paling efisien. Lebih efisien untuk tidak menguji dengan 'isset', seperti yang akan ditunjukkan oleh pengujian saya.
Uji:
function A() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; unset($defined); } } function B() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; unset($undefined); } } function C() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; if (isset($defined)) unset($defined); } } function D() { for ($i = 0; $i < 10000000; $i++) { $defined = 1; if (isset($undefined)) unset($undefined); } } $time_pre = microtime(true); A(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function A time = $exec_time "; $time_pre = microtime(true); B(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function B time = $exec_time "; $time_pre = microtime(true); C(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function C time = $exec_time "; $time_pre = microtime(true); D(); $time_post = microtime(true); $exec_time = $time_post - $time_pre; echo "Function D time = $exec_time"; exit();
Hasil:
Function A time = 1.0307259559631
Function B time = 0.72514510154724
Function C time = 1.3804969787598
Function D time = 0.86475610733032
Kesimpulan:
Itu selalu kurang efisien untuk digunakan
isset
, belum lagi jumlah waktu ekstra yang dibutuhkan untuk menulis. Lebih cepat mencobaunset
variabel tak terdefinisi daripada memeriksa apakah bisaunset
.sumber
Jika Anda ingin menghapus variabel maka Anda dapat menggunakan
unset
unset($any_variable); // bool, object, int, string etc
Memeriksa keberadaannya tidak ada manfaatnya saat mencoba menghapus variabel.
Jika variabel adalah array dan Anda ingin menghapus elemen, Anda harus memastikan induknya ada terlebih dahulu, ini juga berlaku untuk properti objek.
unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object
Ini mudah dipecahkan dengan membungkus
unset
dalamif(isset($var)){ ... }
blok.if(isset($undefined_array)){ unset($undefined_array['undefined_element_key']); } if(isset($undefined_object)){ unset($undefined_object->undefined_prop_name); }
Alasan kita hanya memeriksa variabel ( induk ) adalah karena kita tidak perlu memeriksa properti / elemen dan melakukannya akan jauh lebih lambat untuk menulis dan menghitung karena akan menambah pemeriksaan ekstra.
if(isset($array)){ ... } if(isset($object)){ ... }
.vs
$object->prop_name = null; $array['element_key'] = null; // This way elements/properties with the value of `null` can still be unset. if(isset($array) && array_key_exists('element_key', $array)){ ... } if(isset($object) && property_exists($object, 'prop_name')){ ... } // or // This way elements/properties with `null` values wont be unset. if(isset($array) && $array['element_key'])){ ... } if(isset($object) && $object->prop_name)){ ... }
Hal ini tidak perlu dikatakan lagi, tetapi penting juga bahwa Anda mengetahui
type
variabel saat mendapatkan, menyetel dan membatalkan setelan elemen atau properti; menggunakan sintaks yang salah akan menimbulkan kesalahan.Itu sama ketika mencoba untuk membatalkan nilai array atau objek multidimensi. Anda harus memastikan kunci / nama orang tua ada.
if(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
Ketika berhadapan dengan objek, ada hal lain yang perlu dipikirkan, yaitu visibilitas.
Hanya karena ada tidak berarti Anda memiliki izin untuk memodifikasinya.
sumber
unset
memiliki properti objek induk yang tidak ada. Namun, mengganggu kunci dalam array yang tidak ada di PHP8 tidak hanya menimbulkan pemberitahuan tetapi juga peringatan (dapat berubah).Periksa tautan ini https://3v4l.org/hPAto
Alat online menunjukkan kompatibilitas kode untuk berbagai versi PHP
Menurut alat ini kodenya
unset($_SESSION['signup_errors']);
akan berfungsi untuk PHP> = 5.4.0 tanpa memberi Anda pemberitahuan / peringatan / kesalahan.
sumber