PHP sering bertanya satu hal tentang nilai apa pun: “apakah kamu dianggap benar?” Jawaban itulah yang menentukan cabang if mana yang dijalankan, apakah loop berlanjut, dan bagaimana operator ternary memilih hasilnya. Aturan mainnya disebut truthiness: setiap nilai PHP punya padanan boolean ketika dipakai dalam konteks kondisi. Bersamanya hidup satu mekanisme penting bernama short-circuit — kebiasaan operator && dan || berhenti mengevaluasi begitu hasil akhirnya sudah pasti. Pada Chapter penutup Section ini kita akan memetakan daftar lengkap nilai falsy, nilai-nilai yang terkesan kosong padahal truthy, dan cara memanfaatkan short-circuit sebagai penjaga (guard) yang aman.
Semua Nilai Punya Padanan Boolean #
Konversi nilai ke boolean bisa dilakukan eksplisit dengan type casting (bool) — mekanisme casting dibahas tuntas pada Chapter Type Casting
. Konteks kondisi melakukan konversi yang sama secara otomatis:
<?php
var_dump((bool) 42);
var_dump((bool) 0);
var_dump((bool) "php");
var_dump((bool) "");
var_dump((bool) -1);
var_dump((bool) 0.001);Output yang Dihasilkan:
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(true)Angka selain nol, string tidak kosong, dan angka negatif semuanya bernilai true. Pola umumnya intuitif, tetapi PHP mendefinisikan daftar pengecualian secara eksplisit — dan daftar itulah yang wajib kita hafal, bukan sekadar menduga.
Daftar Lengkap Nilai Falsy #
Terdapat tepat tujuh nilai yang dianggap false oleh PHP; seluruh nilai lain di alam semesta PHP adalah truthy. Mari kita buktikan satu per satu:
<?php
$nilaiUji = [false, 0, 0.0, "", "0", [], null];
foreach ($nilaiUji as $nilai) {
echo ($nilai ? "truthy" : "falsy") . "\n";
}Output yang Dihasilkan:
falsy
falsy
falsy
falsy
falsy
falsy
falsyKetujuh baris keluaran sama-sama falsy, sesuai urutan array: false, integer 0, float 0.0, string kosong "", string "0" (satu-satunya string falsy!), array kosong [], dan null. Tabel berikut merangkum semuanya beserta catatan pentingnya:
| Nilai | Tipe | Catatan |
|---|---|---|
false | bool | Nilai boolean aslinya |
0 | int | Termasuk 0 hasil perhitungan apa pun |
0.0 | float | Termasuk -0.0 |
"" | string | String kosong |
"0" | string | Satu-satunya string non-kosong yang falsy |
[] | array | Array tanpa element |
null | null | Termasuk variabel yang belum diisi |
Nilai yang Terkesan Kosong tapi Truthy #
Jebakan truthiness justru berkumpul di nilai-nilai yang terlihat seperti anggota tabel di atas. Perhatikan hasil eksekusi berikut:
<?php
var_dump((bool) "0.0");
var_dump((bool) "00");
var_dump((bool) " ");
var_dump((bool) "false");
var_dump((bool) [0]);
var_dump((bool) "0.1");Output yang Dihasilkan:
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)Keenam nilai di atas semuanya true. String "0.0" dan "00" falsy hanya bila persis "0"; tambahkan satu karakter apa pun dan ia menjadi truthy. String berisi satu spasi " " pun truthy, sekalipun tak terlihat di layar — untuk memeriksa “isi setelah dipangkas”, gunakan trim() dari Section String dan Text Processing. Array [0] berisi satu element bernilai nol, dan array yang tidak kosong selalu truthy berapa pun isinya.
Satu aturan tambahan yang menyelamatkan banyak bug: object selalu truthy, sekalipun propertinya kosong semua. Pengecualian pada object SimpleXML yang membungkus element kosong sudah dihapus sejak PHP 8, jadi aturannya kini bersih:
<?php
class Keranjang {
public array $item = [];
}
$keranjang = new Keranjang();
var_dump((bool) $keranjang);
var_dump((bool) $keranjang->item);Output yang Dihasilkan:
bool(true)
bool(false)Object $keranjang menghasilkan true meski segalanya di dalamnya kosong, sementara array di properti $item tetap mengikuti aturan array dan menghasilkan false. Perbedaan ini penting saat mengecek “apakah pengguna punya keranjang?” — jawaban yang benar diperoleh dengan !== null atau ?-> dari Chapter Nullsafe Operator
, bukan dengan truthiness.
Short-Circuit pada && dan || #
Operator && dan || mengevaluasi operandnya malas: begitu hasil akhir bisa dipastikan, operand sisanya tidak pernah disentuh. Karena false && apa-pun pasti false, dan true || apa-pun pasti true, PHP berhenti tepat di situ:
<?php
function catatAktifitas(string $label): bool {
echo "fungsi $label() dipanggil\n";
return true;
}
$hasil1 = false && catatAktifitas("A");
$hasil2 = true || catatAktifitas("B");
echo "hasil1: " . var_export($hasil1, true) . ", hasil2: " . var_export($hasil2, true) . "\n";
$hasil3 = true && catatAktifitas("C");
$hasil4 = false || catatAktifitas("D");
echo "hasil3: " . var_export($hasil3, true) . ", hasil4: " . var_export($hasil4, true) . "\n";Output yang Dihasilkan:
hasil1: false, hasil2: true
fungsi C() dipanggil
fungsi D() dipanggil
hasil3: true, hasil4: truePerhatikan keluarannya saksama: baris "fungsi A() dipanggil" dan "fungsi B() dipanggil" tidak pernah muncul. Operand kiri false && ... sudah cukup untuk memutuskan hasilnya false, sehingga catatAktifitas("A") tidak dieksekusi; hal yang sama terjadi pada true || catatAktifitas("B"). Sebaliknya, kasus true && ... dan false || ... belum bisa diputuskan dari operand kiri, jadi fungsi di operand kanan benar-benar berjalan dan teksnya tercetak. (Fungsi dibahas tuntas pada Section Fungsi; di sini ia hanya menjadi alat bukti yang terlihat.)
Short-Circuit sebagai Penjaga #
Sifat malas ini bukan sekadar fakta menarik — ia adalah alat keamanan. Pola guard menempatkan pemeriksaan murah dan penentu di operand kiri, operasi berisiko di operand kanan. Contoh klasiknya adalah pembagian yang harus menunggu pembagi terbukti bukan nol:
<?php
$pembagi = 0;
$aman = $pembagi != 0 && 100 / $pembagi > 5;
var_dump($aman);Output yang Dihasilkan:
bool(false)Karena $pembagi != 0 bernilai false, PHP berhenti dan 100 / $pembagi > 5 tidak pernah dievaluasi — program berjalan normal dengan hasil false. Bandingkan dengan urutan yang dibalik:
<?php
$pembagi = 0;
$rasio = 100 / $pembagi > 5 && $pembagi != 0;Kali ini pembagian dievaluasi lebih dulu, dan program berhenti dengan fatal error berikut (diambil dari eksekusi nyata di PHP 8.4; nama berkas dan nomor baris menyesuaikan kode Anda):
Fatal error: Uncaught DivisionByZeroError: Division by zero in contoh.php on line 4Pola yang sama berlaku untuk menghindari pemanggilan method pada null ($objek !== null && $objek->aktif()) dan untuk memberi jalur cadangan pada sumber data — cache dulu, baru sumber mahal:
<?php
function bacaCache(): ?string {
return null; // cache kosong untuk simulasi
}
function bacaDatabase(): string {
echo "(mengambil dari database...)\n";
return "data utama";
}
$data = bacaCache() ?? bacaDatabase();
echo $data . "\n";Output yang Dihasilkan:
(mengambil dari database...)
data utamaOperator ?? mewarisi sifat short-circuit yang sama: karena bacaCache() menghasilkan null, giliran bacaDatabase() tiba; selama cache terisi, fungsi kedua tidak pernah menyentuh database. Untuk operasi berkas, pola guard klasik PHP memakai or — ingat dari Chapter Operator Precedence
bahwa = lebih kuat dari or, sehingga penugasan selesai dulu dan exit hanya berjalan bila operasinya gagal:
<?php
$berkasStok = __DIR__ . "/stok.txt";
$handle = fopen($berkasStok, "r") or exit("Gagal membuka berkas stok\n");
$isi = fread($handle, filesize($berkasStok)) or exit("Berkas stok kosong\n");
fclose($handle);
echo "Isi stok hari ini:\n" . $isi;Output yang Dihasilkan:
Isi stok hari ini:
Kopi: 12 sachet
Teh: 30 kotakFungsi fopen() menghasilkan resource berkas saat berhasil (truthy) sehingga or berhenti dan exit() dilewati; saat gagal ia menghasilkan false dan exit() menghentikan program dengan pesan. Konstruk exit() sendiri akan dibahas pada Section Control Flow — pola ... or exit(...) sudah cukup umum untuk Anda kenali sejak sekarang. (Berkas stok.txt yang dibaca contoh ini tersedia di bundle Chapter.)
Ringkasan #
Truthiness adalah padanan boolean setiap nilai: tepat tujuh nilai falsy (false, 0, 0.0, "", "0", [], null) dan sisanya truthy — termasuk "0.0", " ", [0], dan semua object. Operator && serta || mengevaluasi operandnya secara short-circuit, dan pola guard memakai sifat itu untuk menempatkan pemeriksaan pengaman sebelum operasi berisiko. Dengan ini kita menutup Section Operator dan Expression — bekal berharga untuk Section berikutnya, karena if, while, dan match semuanya hidup di atas konsep kondisi boolean yang baru saja kita kuasai.
Referensi #
- Dokumentasi tipe boolean (konversi ke boolean) — php.net
- Dokumentasi operator logika — php.net
- Fungsi empty() — php.net
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Truthiness dan Short-Circuit
// Jalankan dengan: php contoh.php
// 1. Tujuh nilai falsy
$nilaiFalsy = [false, 0, 0.0, "", "0", [], null];
echo "Nilai falsy:\n";
foreach ($nilaiFalsy as $nilai) {
echo " " . var_export($nilai, true) . " => falsy\n";
}
// 2. Nilai yang terkesan kosong tapi truthy
echo "Nilai truthy yang mengejutkan:\n";
foreach (["0.0", "00", " ", "false", [0]] as $nilai) {
echo " " . var_export($nilai, true) . " => truthy\n";
}
// 3. Short-circuit: operand kanan bisa tidak pernah dievaluasi
function catatAktifitas(string $label): bool {
echo " fungsi $label() dipanggil\n";
return true;
}
echo "false && catatAktifitas(\"A\"):\n";
$hasil1 = false && catatAktifitas("A");
echo " hasil: " . var_export($hasil1, true) . "\n";
echo "true || catatAktifitas(\"B\"):\n";
$hasil2 = true || catatAktifitas("B");
echo " hasil: " . var_export($hasil2, true) . "\n";
// 4. Guard: pembagi dicek sebelum pembagian dievaluasi
$pembagi = 0;
$aman = $pembagi != 0 && 100 / $pembagi > 5;
echo "Guard pembagian aman: " . var_export($aman, true) . "\n";
// 5. Guard berkas: or exit() hanya berjalan bila operasi gagal
$berkasStok = __DIR__ . "/stok.txt";
$handle = fopen($berkasStok, "r") or exit("Gagal membuka berkas stok\n");
$isi = fread($handle, filesize($berkasStok)) or exit("Berkas stok kosong\n");
fclose($handle);
echo "Isi stok hari ini:\n" . $isi;