Perbedaan isset dan empty di PHP terletak pada apa yang sebenarnya diuji: isset memeriksa apakah variabel ada dan nilainya bukan null, sedangkan empty menganggap banyak nilai sebagai kosong, termasuk string kosong dan angka nol. Memilih yang salah membuat kode lolos validasi padahal datanya tidak valid, atau justru menolak input yang sebenarnya wajar. Perbandingan berikut memakai contoh yang bisa kamu jalankan langsung di PHP untuk melihat hasilnya.

Bagaimana isset Menilai Sebuah Variabel

isset mengembalikan true hanya jika variabel sudah dideklarasikan dan nilainya bukan null. Nilai lain, termasuk string kosong, angka 0, dan array kosong, tetap dianggap ada.

$nama = '';
var_dump(isset($nama)); // bool(true)

$jumlah = 0;
var_dump(isset($jumlah)); // bool(true)

$data = null;
var_dump(isset($data)); // bool(false)

var_dump(isset($belumDidefinisikan)); // bool(false)

Karena itu isset cocok dipakai saat kamu hanya ingin tahu apakah sebuah kunci atau variabel tersedia, tanpa peduli isinya. Contoh paling umum adalah memeriksa kunci array dari parameter URL atau hasil query.

if (isset($_GET['halaman'])) {
    $halaman = $_GET['halaman'];
}

isset juga bisa menerima beberapa argumen sekaligus dan hanya bernilai true jika semuanya ada. Ini berguna untuk memastikan beberapa field form terkirim sebelum diproses.

if (isset($_POST['nama'], $_POST['email'])) {
    // kedua field terkirim
}

Nilai Apa Saja yang Dianggap empty

empty mengembalikan true untuk variabel yang belum ada, bernilai null, string kosong, string “0”, angka 0 atau 0.0, false, dan array kosong. Daftar ini yang sering mengejutkan pemula karena string “0” dianggap kosong.

Nilai isset empty
“” true true
“0” true true
0 true true
null false true
[] true true
“teks” true false

Perhatikan baris “0”. Kalau kamu memvalidasi jumlah barang dengan empty dan pembeli memasukkan angka 0, form akan ditolak seolah tidak diisi. Untuk kasus semacam ini, bandingkan nilainya secara eksplisit atau gunakan filter validasi angka.

Kesalahan Umum Saat Menggabungkan Keduanya

Kombinasi !isset($x) || empty($x) sering muncul di kode lama, padahal redundan. empty sudah mengembalikan true untuk variabel yang belum didefinisikan, jadi pengecekan isset di depannya tidak menambah informasi. Cukup pakai satu saja sesuai tujuan.

Kesalahan lain adalah memakai empty untuk memeriksa hasil fungsi yang selalu mengembalikan nilai. Misalnya, memanggil fungsi lalu mengecek empty tanpa menyimpan hasilnya di variabel akan memicu error di versi PHP lama, dan tetap sulit dibaca di versi baru.

Aturan praktis: pakai isset untuk pertanyaan “apakah ada?”, pakai empty untuk pertanyaan “apakah isinya bisa diabaikan?”.

Operator Null Coalescing sebagai Pengganti Pola Isset

Sejak PHP 7, ?? menggantikan pola isset($x) ? $x : $default. Operator ini mengembalikan nilai kiri jika ada dan bukan null, atau nilai kanan jika tidak.

$nama = $_POST['nama'] ?? 'Tamu';
$limit = $_GET['limit'] ?? 10;

Operator ini juga bisa dirangkai untuk mengambil nilai dari beberapa sumber berurutan. Rantai ?? berhenti pada nilai pertama yang tidak null, sehingga kamu bisa menetapkan nilai cadangan bertingkat tanpa if bersarang.

$warna = $pilihanUser ?? $pengaturanDefault ?? 'biru';

Perlu dicatat, ?? hanya mengecek keberadaan dan null. Kalau $_GET['limit'] berisi string kosong, hasilnya tetap string kosong, bukan 10. Untuk data dari luar, tambahkan validasi tipe setelahnya.

Memilih Antara isset, empty, dan Null Coalescing

Urutan keputusan berikut membantu mempersempit pilihan sebelum menulis baris kode.

  • Butuh nilai cadangan saat data tidak ada: pakai ??.
  • Hanya ingin tahu apakah kunci atau variabel tersedia tanpa mengubah nilai: pakai isset().
  • Ingin menolak nilai yang dianggap tidak berisi, termasuk string kosong: pakai empty().
  • Validasi angka atau string dengan aturan spesifik: jangan andalkan empty, pakai is_numeric(), filter_var(), atau perbandingan langsung.
  • Data berasal dari form atau URL: selalu lanjutkan dengan sanitasi sebelum dipakai di query, seperti dibahas di 7 teknik menghindari SQL injection di PHP.

Pengecekan yang rapi berpengaruh pada pesan error yang ditampilkan ke pengguna. Kalau kamu ingin mengatur bagaimana peringatan muncul saat variabel tidak sesuai harapan, teknik di 7 cara menampilkan pesan error di PHP bisa jadi acuan.

Konteks Array dan Data dari JavaScript

Saat mengirim data dari halaman ke server lewat AJAX, struktur yang diterima PHP bisa berbeda dari yang dibayangkan. Ada kalanya array tidak terbaca karena format pengiriman tidak sesuai, dan pembahasan di mengapa array PHP tidak muncul di JavaScript menjelaskan sumber masalahnya. Di sisi klien, pemilihan struktur data memengaruhi cara kamu mengirimnya, seperti dibandingkan dalam memilih format data jQuery: objek, array, atau JSON.

Untuk data bersarang, isset dan empty tetap bekerja pada kunci tertentu, tetapi rantai null coalescing membuat pengecekan lebih pendek. Contohnya saat membaca konfigurasi bertingkat:

$timeout = $config['koneksi']['timeout'] ?? 30;

Baris itu tidak memunculkan peringatan meskipun kunci koneksi tidak ada, berbeda dengan akses langsung yang bisa memicu notice. Ini alasan ?? lebih aman untuk struktur data yang tidak sepenuhnya dijamin.

Ringkasan

isset memeriksa keberadaan variabel dan menolak null, empty menganggap sejumlah nilai seperti string kosong, angka nol, dan array kosong sebagai tidak berisi, sedangkan ?? memberi nilai cadangan dalam satu ekspresi. Pilih berdasarkan pertanyaan yang ingin kamu jawab, dan untuk data dari luar selalu tambahkan validasi tipe setelah pengecekan. Mengetahui perilaku masing-masing mencegah bug yang muncul hanya pada input tertentu.

Pertanyaan yang Sering Diajukan

Apakah empty bisa dipakai pada variabel yang belum didefinisikan?

Bisa. empty mengembalikan true untuk variabel yang belum ada tanpa memunculkan peringatan, karena itu sering dipakai sebagai pengecekan awal. Namun kode jadi kurang jelas maksudnya; kalau tujuannya mengecek keberadaan saja, isset lebih tepat.

Kenapa string “0” dianggap kosong oleh empty?

PHP menganggap string “0” setara dengan nilai false dalam konteks boolean. Kalau kamu memvalidasi input yang boleh bernilai nol, gunakan perbandingan eksplisit atau filter validasi agar input sah tidak ikut ditolak.

Apa bedanya ?? dengan ?: di PHP?

?? hanya beralih ke nilai kanan jika kiri tidak ada atau null. Operator ?: beralih ke nilai kanan untuk semua nilai yang dianggap falsy, termasuk string kosong dan angka nol, sehingga perilakunya lebih dekat ke empty.