Topik ini membahas percabangan dengan if, elseif, dan else di PHP, mulai dari bentuk dasarnya, penyusunan kondisi yang digabungkan dengan operator logika, hingga sintaks alternatif yang dirancang untuk template. Pada bagian akhir, kesalahan yang sering muncul saat percabangan dipraktikkan dibahas beserta perbaikannya. Setelah topik ini dipelajari, percabangan satu tingkat maupun bertingkat dapat ditulis dengan struktur yang jelas dan mudah diuji.
Percabangan if, elseif, dan else#
Pernyataan if mengeksekusi sebuah blok kode apabila kondisinya bernilai true. Kondisi berupa ekspresi apa pun yang hasilnya dikonversi menjadi bool, biasanya hasil operator perbandingan seperti === atau operator logika. Apabila kondisi bernilai false, blok else yang menjadi pasangannya dijalankan, dan bila blok itu tidak dituliskan, eksekusi berlanjut ke pernyataan setelahnya. Contoh berikut mengklasifikasikan nilai ujian ke dalam predikat menggunakan rangkaian if, elseif, dan else.
<?php
$nilai = 86;
if ($nilai >= 90) {
$predikat = 'Sangat baik';
} elseif ($nilai >= 80) {
$predikat = 'Baik';
} elseif ($nilai >= 70) {
$predikat = 'Cukup';
} else {
$predikat = 'Perlu bimbingan';
}
echo "Nilai: $nilai", PHP_EOL;
echo "Predikat: $predikat", PHP_EOL;Nilai: 86
Predikat: BaikRangkaian kondisi diuji berurutan dari atas ke bawah, dan hanya blok pertama yang kondisinya bernilai true yang dijalankan. Karena itu, kondisi yang lebih ketat diletakkan lebih dulu, sebab angka 95 juga memenuhi syarat $nilai >= 80 dan $nilai >= 70. Bila urutannya terbalik, cabang yang lebih umum menelan cabang yang lebih khusus. Diagram berikut memperlihatkan urutan evaluasi tersebut.
Menyusun kondisi#
Kondisi dapat menggabungkan beberapa pemeriksaan menjadi satu ekspresi menggunakan operator logika && untuk dan, || untuk atau, serta ! untuk negasi. Operator && hanya menghasilkan true bila kedua sisinya bernilai true, sedangkan || sudah cukup dengan satu sisi yang bernilai true. Evaluasi sisi kanan dihentikan lebih awal apabila sisi kiri sudah menentukan hasilnya, sehingga pemeriksaan yang paling ringan sebaiknya diletakkan di sebelah kiri. Tanda kurung digunakan bila && dan || muncul dalam satu kondisi agar urutan evaluasinya terbaca.
Contoh berikut menilai pembacaan sensor suhu ruangan. Status Kritis hanya dinyatakan bila alarm menyala dan bacaannya berada di luar rentang aman. Kedua syarat itu digabungkan dengan &&, sedangkan pemeriksaan di luar rentang aman menggabungkan dua batas suhu dengan ||.
<?php
$suhu = 31.5;
$alarmAktif = true;
if ($alarmAktif && ($suhu >= 35.0 || $suhu <= 15.0)) {
$status = 'Kritis';
} elseif ($suhu >= 28.0 || $suhu <= 20.0) {
$status = 'Perhatian';
} else {
$status = 'Normal';
}
echo "Suhu terbaca: $suhu derajat Celsius", PHP_EOL;
echo "Status ruangan: $status", PHP_EOL;Suhu terbaca: 31.5 derajat Celsius
Status ruangan: PerhatianApabila ekspresi kondisi bukan bool, PHP mengonversinya secara otomatis. Angka 0, string kosong, dan array kosong dianggap false, sedangkan nilai lainnya dianggap true. Konversi otomatis ini praktis, tetapi perbandingan eksplisit seperti $jumlah === 0 membuat maksud kode lebih mudah dibaca.
Untuk memilih salah satu dari dua nilai dalam satu ekspresi, PHP menyediakan operator ternary dengan bentuk $kondisi ? nilai_a : nilai_b. Bentuk ini sesuai untuk penugasan sederhana, misalnya menentukan label di dalam template, sedangkan percabangan yang tubuhnya memuat beberapa pernyataan tetap dituliskan dengan if.
Sintaks alternatif untuk template#
Sintaks alternatif menggantikan kurung kurawal percabangan dengan titik dua dan kata kunci penutup endif, sehingga bentuknya menjadi if (...):, elseif (...):, else:, dan endif;. PHP sejak awal dirancang untuk bercampur dengan HTML, dan di dalam template, kurung kurawal yang bersarang sulit dilacak sementara endif memberi penanda akhir yang eksplisit. Bentuk ini tidak mengubah perilaku if, melainkan hanya memindahkan penanda bloknya, sehingga keduanya dapat dipilih sesuai konteks.
Berkas kartu-status.php berikut adalah template utuh yang dapat dirender. Variabel $_GET adalah array superglobal yang berisi parameter dari query string URL. Operator ?? memberi nilai bawaan hadir apabila parameter status tidak dikirim, sehingga berkas ini tetap dapat dirender dari terminal tanpa parameter.
<?php $status = $_GET['status'] ?? 'hadir'; ?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Kartu Kehadiran</title>
</head>
<body>
<h1>Kartu Kehadiran</h1>
<?php if ($status === 'hadir'): ?>
<p>Siswa hadir mengikuti seluruh jadwal kelas.</p>
<?php elseif ($status === 'izin'): ?>
<p>Siswa mengajukan izin beserta surat keterangan.</p>
<?php else: ?>
<p>Siswa tidak hadir tanpa keterangan.</p>
<?php endif; ?>
</body>
</html>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Kartu Kehadiran</title>
</head>
<body>
<h1>Kartu Kehadiran</h1>
<p>Siswa hadir mengikuti seluruh jadwal kelas.</p>
</body>
</html>Perintah berikut menyalakan server bawaan PHP selama beberapa detik, mengambil kartu dengan parameter status=izin, lalu menghentikan servernya. Satu berkas template yang sama menghasilkan paragraf yang berbeda hanya karena query string-nya berbeda.
# jalankan server bawaan PHP di latar belakang
php -S localhost:8020 >/dev/null 2>&1 &
sleep 1
# ambil kartu dengan parameter status=izin melalui curl
curl -s "http://localhost:8020/kartu-status.php?status=izin"
# hentikan server
kill $!<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Kartu Kehadiran</title>
</head>
<body>
<h1>Kartu Kehadiran</h1>
<p>Siswa mengajukan izin beserta surat keterangan.</p>
</body>
</html>Kesalahan umum#
Kesalahan pertama adalah menuliskan = alih-alih == atau === di dalam kondisi. Penugasan adalah ekspresi yang sah dan menghasilkan nilai yang ditugaskan, sehingga PHP tidak menolak kondisi tersebut, padahal yang dimaksud adalah perbandingan. Contoh berikut memperlihatkan akibatnya.
<?php
$stok = 0;
// keliru: tanda = menugaskan nilai, bukan membandingkan
if ($stok = 10) {
echo "Cabang if terjalankan meskipun stok semula 0.", PHP_EOL;
}
echo "Nilai stok sekarang: $stok", PHP_EOL;Cabang if terjalankan meskipun stok semula 0.
Nilai stok sekarang: 10Cabang if terjalankan karena $stok = 10 menghasilkan 10 yang dianggap true, dan nilai $stok ikut berubah menjadi 10. Perbaikannya adalah menuliskan perbandingan yang dimaksud, yaitu $stok === 10, dan memindahkan penugasan ke luar kondisi. Editor yang dilengkapi alat analisis statis (linter) umumnya menandai pola ini, sehingga peringatannya jangan diabaikan.
Kesalahan kedua adalah mengandalkan konversi bool untuk pemeriksaan yang sebenarnya membutuhkan perbandingan eksplisit. Kondisi if ($jumlah) bernilai false ketika $jumlah berisi 0, padahal 0 bisa menjadi nilai yang sah dan berbeda makna dari ketiadaan data. Untuk kasus seperti ini, gunakan perbandingan eksplisit $jumlah === 0, atau fungsi isset() bila yang diperiksa adalah keberadaan variabelnya.
Kesalahan ketiga adalah urutan kondisi yang tumpang-tindih sehingga cabang yang lebih khusus tidak pernah tersentuh. Percabangan berjenjang diurutkan dari yang paling khusus ke yang paling umum. Kesalahan semacam ini ditemukan dengan menjalankan percabangan menggunakan beberapa nilai batas, misalnya 69, 70, 89, dan 90, lalu membandingkan predikatnya dengan harapan.
Ringkasan#
ifmengeksekusi bloknya bila kondisi bernilai true, rangkaianelseifdiuji berurutan, dan hanya cabang pertama yang cocok yang dijalankan.- Kondisi berupa ekspresi yang dikonversi menjadi bool, sehingga 0, string kosong, dan array kosong bernilai false.
- Sintaks alternatif
if (...): ... endif;menggantikan kurung kurawal dan lazim dipakai di dalam template HTML. - Tanda
=di dalam kondisi adalah penugasan, bukan perbandingan, sehingga pemeriksaan nilai dituliskan dengan===atau==.
Referensi#
- Percabangan if — PHP Manual — Dokumentasi resmi if, elseif, dan else beserta contoh penggunaannya.
- Sintaks alternatif — PHP Manual — Dokumentasi bentuk percabangan dengan titik dua dan endif yang ditujukan untuk template campuran HTML.
- Tipe boolean — PHP Manual — Daftar nilai yang dianggap false ketika dikonversi menjadi bool.