Keputusan dalam program nyata jarang berhenti pada satu pertanyaan ya/tidak. Sebuah toko daring perlu memeriksa apakah pengguna sudah login, apakah total belanja melewati ambang minimum, dan apakah stok barang masih tersedia sebelum menentukan promo yang berlaku. Nested conditions — struktur if yang berada di dalam blok if lain — adalah cara paling langsung untuk menyusun pemeriksaan berlapis seperti itu. Pada chapter ini kita akan menulis kondisi bersarang, mengenali tanda-tanda sarang yang mulai merusak keterbacaan, lalu merapikannya dengan dua teknik yang akan terus Anda pakai: guard clause dan penggabungan kondisi.
if di Dalam if #
Interpreter PHP mengevaluasi if terluar terlebih dahulu. Ketika kondisi terluar bernilai false, seluruh blok di dalamnya — termasuk if yang bersarang — dilewati tanpa pernah diperiksa. Barulah ketika kondisi terluar bernilai true, interpreter masuk ke dalam blok dan mengevaluasi if tingkat berikutnya. Perilaku berlapis ini cocok untuk kasus ketika pemeriksaan tingkat dalam hanya relevan setelah pemeriksaan tingkat luar lolos.
<?php
$sudahLogin = true;
$totalBelanja = 750000;
if ($sudahLogin) {
if ($totalBelanja >= 500000) {
echo "Selamat, Anda berhak mendapat gratis ongkir!\n";
} else {
echo "Belanja minimal Rp500000 untuk gratis ongkir.\n";
}
} else {
echo "Silakan login terlebih dahulu untuk menikmati promo.\n";
}Output yang Dihasilkan:
Selamat, Anda berhak mendapat gratis ongkir!Mari kita amati alur eksekusinya:
- Baris 6 (
if ($sudahLogin)): kondisi terluar bernilai true karena$sudahLoginberisitrue, sehingga interpreter masuk ke blok pertama. - Baris 7 (
if ($totalBelanja >= 500000)): perbandingan750000 >= 500000bernilai true, sehingga cabang paling dalam dieksekusi. - Baris 8 (
echo ...): pesan sukses dicetak, dan kedua blokelsesama sekali tidak dijalankan.
Setiap else dipasangkan dengan if terdekat pada tingkat yang sama. Karena itu, indentasi yang rapi bukan sekadar gaya penulisan: indentasi menunjukkan kepada pembaca manusia struktur logika yang sama dengan yang dilihat interpreter dari posisi kurung kurawal.
Bahaya Sarang yang Terlalu Dalam #
Kondisi bersarang bekerja, tetapi tidak berskala dengan baik. Setiap tingkat menambah satu lapis indentasi dan satu kondisi yang harus diingat pembaca; kode yang meruncing ke kanan sering dijuluki arrow code. Pada kode seperti itu, aturan bisnis penting terkubur di kedalaman tertentu dan sulit direview. Contoh berikut memakai tiga tingkat pemeriksaan untuk menentukan status pengiriman pesanan.
<?php
function statusPengirimanSarang($sudahLogin, $sudahBayar, $stok)
{
if ($sudahLogin) {
if ($sudahBayar) {
if ($stok > 0) {
return "Pesanan siap dikirim.";
} else {
return "Stok habis, pesanan ditunda.";
}
} else {
return "Pesanan menunggu pembayaran.";
}
} else {
return "Silakan login terlebih dahulu.";
}
}
echo statusPengirimanSarang(true, true, 3), "\n";
echo statusPengirimanSarang(true, true, 0), "\n";
echo statusPengirimanSarang(true, false, 3), "\n";
echo statusPengirimanSarang(false, true, 3), "\n";Output yang Dihasilkan:
Pesanan siap dikirim.
Stok habis, pesanan ditunda.
Pesanan menunggu pembayaran.
Silakan login terlebih dahulu.Function statusPengirimanSarang() menghasilkan hasil yang benar: keempat pemanggilan mencetak status yang sesuai. Namun, untuk memahami kapan string "Stok habis, pesanan ditunda." dikembalikan, pembaca harus memastikan dua kondisi sebelumnya ($sudahLogin dan $sudahBayar) sama-sama true. Semakin dalam sarangnya, semakin banyak konteks yang harus dibawa pembaca di kepalanya — dan semakin mudah bug bersembunyi.
Guard Clause dan Early Return #
Guard clause membalik arah logika: alih-alih menumpuk pemeriksaan syarat utama, kita periksa kondisi yang membuat permintaan gagal terlebih dahulu, lalu keluar segera dengan return (pola ini disebut early return). Dengan begitu, jalur bahagia tidak lagi terkubur di kedalaman indentasi. Berikut versi refactor dari function sebelumnya.
<?php
function statusPengiriman($sudahLogin, $sudahBayar, $stok)
{
if (!$sudahLogin) {
return "Silakan login terlebih dahulu.";
}
if (!$sudahBayar) {
return "Pesanan menunggu pembayaran.";
}
if ($stok <= 0) {
return "Stok habis, pesanan ditunda.";
}
return "Pesanan siap dikirim.";
}
echo statusPengiriman(true, true, 3), "\n";
echo statusPengiriman(true, true, 0), "\n";
echo statusPengiriman(true, false, 3), "\n";
echo statusPengiriman(false, true, 3), "\n";Output yang Dihasilkan:
Pesanan siap dikirim.
Stok habis, pesanan ditunda.
Pesanan menunggu pembayaran.
Silakan login terlebih dahulu.Mari kita bandingkan strukturnya:
- Tiga guard clause pertama masing-masing menangkap satu kondisi gagal — belum login, belum bayar, stok habis — dan langsung mengembalikan pesan yang sesuai.
- Baris
return "Pesanan siap dikirim.";hanya tercapai bila semua syarat lolos, tanpa perluelsesama sekali. - Output kedua versi identik, tetapi pada versi guard clause setiap aturan bisnis berdiri di tingkat indentasi pertama sehingga dapat dibaca seperti daftar periksa.
Guard clause paling natural di dalam function karena return mengakhiri eksekusinya. Di luar function — misalnya pada skrip prosedural sederhana — teknik perapian utama kita adalah menggabungkan kondisi, topik bagian berikutnya.
Menggabungkan Kondisi dengan Operator Logika #
Sering kali sarang if sebenarnya menyatakan satu gagasan tunggal: “semua kondisi berikut harus benar”. Operator logika && (dan) menyatakannya dalam satu baris tanpa menambah indentasi, sedangkan || (atau) menyatakan alternatif. Kedua operator ini sudah Anda kenal dari Section Operator dan Expression; di sini kita memakainya untuk meratakan struktur percabangan.
<?php
$sudahLogin = true;
$totalBelanja = 750000;
$punyaVoucher = false;
if ($sudahLogin && $totalBelanja >= 500000 && $punyaVoucher) {
echo "Diskon voucher diterapkan.\n";
} elseif ($sudahLogin && $totalBelanja >= 500000) {
echo "Gratis ongkir diterapkan.\n";
} else {
echo "Tidak ada promo yang cocok.\n";
}Output yang Dihasilkan:
Gratis ongkir diterapkan.Karena $punyaVoucher bernilai false, gabungan pertama gagal meskipun dua kondisi awalnya benar, sehingga cabang elseif yang berjalan. Perlu diingat juga bahwa && mengevaluasi secara short-circuit: operand di kanan hanya diperiksa bila operand di kirinya bernilai true, sehingga pemeriksaan berikutnya dapat mengandalkan keberhasilan pemeriksaan sebelumnya.
Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.
Ringkasan #
Kondisi bersarang menumpuk pemeriksaan berlapis secara berurutan, tetapi kedalaman sarang di atas dua sampai tiga tingkat menurunkan keterbacaan dengan cepat. Guard clause meratakan logika dengan memeriksa kondisi gagal lebih dulu dan keluar melalui early return, sedangkan operator && dan || memadukan beberapa pemeriksaan ke dalam satu kondisi. Ketika seluruh cabang hanya memetakan satu nilai ke satu hasil — misalnya kode bahasa menjadi sapaan — PHP menyediakan struktur yang lebih ringkas daripada rantai if-elseif: match expression, topik chapter berikutnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman contoh Chapter Nested Conditions.
// Jalankan dengan: php contoh.php
// 1. Kondisi bersarang sederhana
$sudahLogin = true;
$totalBelanja = 750000;
if ($sudahLogin) {
if ($totalBelanja >= 500000) {
echo "Selamat, Anda berhak mendapat gratis ongkir!\n";
} else {
echo "Belanja minimal Rp500000 untuk gratis ongkir.\n";
}
} else {
echo "Silakan login terlebih dahulu untuk menikmati promo.\n";
}
// 2. Guard clause dengan early return
function statusPengiriman($sudahLogin, $sudahBayar, $stok)
{
if (!$sudahLogin) {
return "Silakan login terlebih dahulu.";
}
if (!$sudahBayar) {
return "Pesanan menunggu pembayaran.";
}
if ($stok <= 0) {
return "Stok habis, pesanan ditunda.";
}
return "Pesanan siap dikirim.";
}
echo statusPengiriman(true, true, 3), "\n";
echo statusPengiriman(true, true, 0), "\n";
echo statusPengiriman(true, false, 3), "\n";
echo statusPengiriman(false, true, 3), "\n";
// 3. Menggabungkan beberapa kondisi dengan operator logika
$punyaVoucher = false;
if ($sudahLogin && $totalBelanja >= 500000 && $punyaVoucher) {
echo "Diskon voucher diterapkan.\n";
} elseif ($sudahLogin && $totalBelanja >= 500000) {
echo "Gratis ongkir diterapkan.\n";
} else {
echo "Tidak ada promo yang cocok.\n";
}