Mengapa memeriksa kedua isset () dan! Empty ()

269

Apakah ada perbedaan antara issetdan !empty. Jika saya melakukan pemeriksaan boolean ganda ini, apakah benar seperti ini atau mubazir? dan adakah cara yang lebih pendek untuk melakukan hal yang sama?

isset($vars[1]) AND !empty($vars[1])
cahaya
sumber
3
Ada bagan yang bagus pada hasil penggunaannya dengan berbagai jenis variabel (mereka memiliki perbedaan) di sini: virendrachandak.com/demos/php-isset-vs-empty-vs-empty-vs-is_null.php
Jeff Clayton
Komplemen yang tepat jelas adalah isset dan is_null, tetapi! Blank mencakup beberapa yang berbeda. Itu semua tergantung pada jenis data yang Anda uji.
Jeff Clayton

Jawaban:

420

Ini sepenuhnya berlebihan. emptylebih atau kurang singkatan !isset($foo) || !$foo, dan !emptyanalog dengan isset($foo) && $foo. Yaitu emptymelakukan hal sebaliknya issetditambah pemeriksaan tambahan untuk kebenaran suatu nilai.

Atau dengan kata lain, emptysama dengan !$foo, tetapi tidak memberikan peringatan jika variabel tidak ada. Itulah poin utama dari fungsi ini: melakukan perbandingan boolean tanpa khawatir tentang variabel yang ditetapkan.

Manual menempatkannya seperti ini:

empty()adalah kebalikan dari (boolean) var, kecuali bahwa tidak ada peringatan yang dihasilkan ketika variabel tidak disetel.

Anda cukup menggunakan di !empty($vars[1])sini.

tipuan
sumber
7
Tapi kalau tidak, $vars[1]dia akan mendapat pemberitahuan.
karim79
6
Saya tidak tahu dari mana saya mendapatkan ide itu. Ditambah satu.
karim79
8
@karim IMO emptyadalah salah satu fungsi yang paling disalahpahami dalam PHP. Cuplikan kecil tentang "tidak ada peringatan yang dihasilkan" sangat mudah untuk diabaikan. Saya harus memindai dokumentasi sendiri beberapa kali untuk menemukannya agar dikirim di sini.
deceze
2
empty($vars[1])tidak menyebabkan peringatan apa pun meski $vars[1]tidak diatur, tetapi echo $vars[1]akan. Saya memeriksa fakta menggunakan echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara
4
@ Shahor Banyak bahasa menganggap 0sebagai false. PHP bukan satu-satunya. Masih tidak yakin apa keluhan Anda.
deceze
33

isset() menguji apakah suatu variabel disetel dan bukan nol:

http://us.php.net/manual/en/function.isset.php

empty() dapat mengembalikan true ketika variabel diatur ke nilai-nilai tertentu:

http://us.php.net/manual/en/function.empty.php

Untuk mendemonstrasikan ini, coba kode berikut dengan $ the_var tidak ditetapkan, atur ke 0, dan atur ke 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>
GreenMatt
sumber
12

Jawaban yang diterima tidak benar.

isset () TIDAK setara dengan! empty ().

Anda akan membuat beberapa bug yang agak tidak menyenangkan dan sulit untuk di-debug jika Anda melewati rute ini. mis. coba jalankan kode ini:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb

Snowcrash
sumber
7
Jawaban yang diterima sama sekali tidak menunjukkan bahwa issetitu setara dengan !empty.
tipuan
8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}
rajmohan
sumber
1
Tapi Anda belum menangani variabel tidak mengatur kasus.
Amil Waduwawara
3

Empty just check adalah variabel / array yang direferensikan memiliki nilai jika Anda memeriksa php doc (kosong) Anda akan melihat hal-hal ini dianggap emtpy

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

sementara isset memeriksa apakah variabel mengeluarkan dan bukan null yang juga dapat ditemukan di php doc (isset)

Breezer
sumber
2

Itu tidak perlu.

Tidak ada peringatan yang dihasilkan jika variabel tidak ada. Itu berarti kosong () pada dasarnya setara dengan! Isset ($ var) || $ var == false

php.net

madlopt
sumber
2
Ini tidak pernah diperlukan pada versi PHP apa pun, karena kosong sudah memeriksa (tidak) menerbitkan. Anda membingungkan fakta bahwa kosong sekarang mendukung ekspresi dengan pertanyaan.
alxgb
Itu benar, lima tahun kemudian.
Lennon
2

isset($vars[1]) AND !empty($vars[1])setara dengan !empty($vars[1]).

Saya menyiapkan kode sederhana untuk menunjukkannya secara empiris.

Baris terakhir adalah variabel yang tidak ditentukan.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

Dan kode

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

Variabel yang tidak terdefinisi harus dievaluasi fungsi luar, karena fungsi itu sendiri membuat variabel sementara dalam lingkup itu sendiri.

Tajni
sumber
0

"Kosong": hanya berfungsi pada variabel. Kosong dapat berarti hal yang berbeda untuk tipe variabel yang berbeda (periksa manual: http://php.net/manual/en/function.empty.php ).

"isset": memeriksa apakah variabel ada dan memeriksa NULL yang benar atau nilai yang salah. Dapat tidak disetel dengan memanggil "tidak disetel". Sekali lagi, periksa manualnya.

Penggunaan salah satu dari itu tergantung pada jenis variabel yang Anda gunakan.

Saya akan mengatakan, lebih aman untuk memeriksa keduanya, karena Anda pertama-tama memeriksa apakah variabelnya ada, dan jika tidak benar-benar NULL atau kosong.

Stuart
sumber
3
@szahn "lebih aman untuk memeriksa keduanya", - Anda sebagai programmer dapat memeriksa semua yang Anda inginkan untuk keamanannya. Tetapi jika kode Anda berlebihan maka Anda bisa menjadi redundan sebagai programmer.
madlopt
0

jika kita menggunakan halaman yang sama untuk menambah / mengedit via tombol kirim seperti di bawah ini

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

maka kita seharusnya tidak menggunakan

isset($_POST['edit_id'])

bcoz edit_iddisetel sepanjang waktu apakah itu menambah atau mengedit halaman, sebagai gantinya kita harus menggunakan kondisi cek di bawah ini

!empty($_POST['edit_id'])
diEcho
sumber
posting sebelumnya dikirim karena saya tekan enter karena kesalahan, inilah jawaban lengkap saya ... mengapa downvote? :(
diEcho
0
  • Dari situs web PHP, merujuk pada empty()fungsinya:

Mengembalikan FALSEjika varmemiliki nilai yang tidak kosong dan tidak nol.

Itu hal yang baik untuk diketahui. Dengan kata lain, semuanya mulai dari NULL, 0hingga "" akan kembali TRUEsaat menggunakan empty()fungsi.

  • Berikut adalah deskripsi isset()fungsi yang dikembalikan:

Pengembalian TRUEjika varada; FALSEjika tidak.

Dengan kata lain, hanya variabel yang tidak ada (atau, variabel dengan NULLnilai ketat ) akan kembali FALSEpada isset()fungsi. Semua variabel yang memiliki jenis nilai apa pun, apakah itu 0, string teks kosong, dll. Akan kembali TRUE.

Ende
sumber