3-2: Switch
Objectives
- Menggunakan switch untuk multiple conditions
- Memahami case dan break
- Kapan menggunakan switch vs if-else
- Memahami perilaku fall-through dan cara memanfaatkannya
- Mengenal perbandingan loose pada switch
Kapan Switch Dibutuhkan?
Ketika kamu harus membandingkan satu nilai dengan banyak kemungkinan, rantai if-elseif bisa menjadi panjang dan berulang. Lihat contoh ini:
<?php
$day = "Monday";
// Rantai if-elseif yang panjang
if ($day == "Monday") {
echo "Hari Senin";
} elseif ($day == "Tuesday") {
echo "Hari Selasa";
} elseif ($day == "Wednesday") {
echo "Hari Rabu";
} else {
echo "Hari lain";
}
?>
Kode di atas bekerja, tapi boros: variabel $day dibandingkan berulang-ulang. switch hadir sebagai alternatif yang lebih rapi — nilai diperiksa sekali, lalu PHP langsung melompat ke case yang cocok:
| Case | Hasil |
|---|---|
case Monday | Hari Senin |
case Tuesday | Hari Selasa |
case Wednesday | Hari Rabu |
default | Hari lain |
Basic Switch
<?php
$day = "Monday";
switch ($day) {
case "Monday":
echo "Hari Senin";
break;
case "Tuesday":
echo "Hari Selasa";
break;
case "Wednesday":
echo "Hari Rabu";
break;
default:
echo "Hari lain";
}
// Output: Hari Senin
?>
Anatomi sebuah switch:
| Bagian | Contoh | Fungsi |
|---|---|---|
| Ekspresi | switch ($day) | Nilai yang akan dibandingkan |
| Case | case "Monday": | Nilai pembanding; jika cocok, eksekusi dimulai dari sini |
| Body | echo "Hari Senin"; | Kode yang dijalankan |
break; | break; | Menghentikan switch, keluar dari blok |
default | default: | Dijalankan jika tidak ada case yang cocok |
default bersifat opsional. Tapi menambahkannya selalu disarankan — ini "jaring pengaman" untuk nilai tak terduga, misalnya input dari user.
Switch tanpa break (Fall-through)
Jika break dihilangkan, eksekusi akan menetes (fall-through) ke case berikutnya:
<?php
$grade = "B";
switch ($grade) {
case "A":
case "B":
case "C":
echo "Lulus";
break;
case "D":
case "E":
echo "Tidak Lulus";
break;
}
// Output: Lulus
?>
Fall-through di sini disengaja: case "A" dan "B" tidak punya body, jadi eksekusi langsung menetes ke case "C" yang punya body. Ini teknik umum untuk mengelompokkan nilai yang berbagi perilaku yang sama.
Fall-through yang tidak disengaja (lupa break) adalah salah satu bug paling terkenal di PHP. Selalu tanya diri sendiri: "apakah case ini memang sengaja menetes ke bawah?"
Contoh bug nyata akibat lupa break:
<?php
$role = "editor";
switch ($role) {
case "admin":
echo "Akses penuh\n";
// lupa break! ❌
case "editor":
echo "Akses edit\n";
// lupa break! ❌
case "viewer":
echo "Hanya baca\n";
}
// Output:
// Akses edit
// Hanya baca
// (BUG: role editor malah dapat pesan viewer juga!)
?>
Switch dengan Multiple Values
<?php
$role = "admin";
switch ($role) {
case "admin":
case "superadmin":
echo "Akses penuh";
break;
case "editor":
echo "Akses terbatas";
break;
case "viewer":
echo "Hanya baca";
break;
default:
echo "Role tidak dikenal";
}
// Output: Akses penuh
?>
Perbandingan Loose (==)
Satu hal penting: switch menggunakan loose comparison (==), bukan strict (===). Ini sering mengecoh:
<?php
$value = "10"; // string
switch ($value) {
case 10: // int — cocok secara loose!
echo "Matched as integer 10";
break;
case "10": // string — tidak akan pernah tercapai
echo "Matched as string 10";
break;
}
// Output: Matched as integer 10
?>
Karena "10" == 10 bernilai true, case pertama yang cocok. Konsekuensinya:
case 0akan cocok dengan string falsy seperti"","0", dannull— kombinasi yang berbahaya.- Jika kamu butuh perbandingan strict, gunakan
matchexpression (lihat materi 3-4) atauif-elsedengan===.
<?php
$input = "0"; // input dari user
switch ($input) {
case 0:
echo "Nol"; // ❌ "0" == 0 -> true, ini yang dieksekusi!
break;
case "0":
echo "String nol";
break;
}
// Output: Nol
?>
Jangan pernah mengandalkan switch untuk membedakan 0, "0", "", dan null — semuanya cocok dengan case 0 karena loose comparison.
Alternative Syntax
<?php
$status = "active";
switch ($status):
case "active":
echo "User aktif";
break;
case "inactive":
echo "User tidak aktif";
break;
default:
echo "Status tidak diketahui";
endswitch;
// Output: User aktif
?>
Sama seperti if, switch punya alternative syntax dengan : dan endswitch;. Cocok dipakai di template HTML.
Switch vs If-Else
| Aspek | Switch | If-Else |
|---|---|---|
| Readability | Lebih clean untuk many cases | OK untuk 2-3 conditions |
| Performance | Faster (single evaluation) | Evaluates each condition |
| Comparison | Loose (==) comparison | Bisa strict (===) |
| Flexibility | Limited | Can use complex conditions |
<?php
// Switch: perfect untuk enum-like values
$color = "red";
switch ($color) {
case "red":
echo "#FF0000";
break;
case "blue":
echo "#0000FF";
break;
}
// If-else: better untuk range checks
$score = 85;
if ($score >= 90) {
echo "A";
} elseif ($score >= 80) {
echo "B";
} else {
echo "C";
}
?>
Aturan praktis memilih:
| Situasi | Pilih |
|---|---|
| Satu nilai, banyak kemungkinan tetap (enum, status, kode) | switch |
Rentang nilai (>= 80, < 60) | if-elseif |
Kondisi kompleks dengan &&, ` | |
Butuh strict comparison (===) | if-else atau match |
| Ingin langsung mendapat nilai balik | match (PHP 8+) |
Switch dengan Ekspresi di Case
Case tidak harus berupa literal — bisa juga ekspresi, selama hasilnya dibandingkan dengan ekspresi switch:
<?php
$total_belanja = 150000;
switch (true) {
case $total_belanja >= 500000:
echo "Diskon 20%";
break;
case $total_belanja >= 200000:
echo "Diskon 10%";
break;
case $total_belanja >= 100000:
echo "Diskon 5%";
break;
default:
echo "Tanpa diskon";
}
// Output: Diskon 5%
?>
Teknik switch (true) ini memaksa setiap case dievaluasi sebagai boolean. Hasilnya mirip if-elseif, tapi dengan visualisasi kasus yang lebih rapi. Namun untuk pola seperti ini, kebanyakan developer tetap lebih suka if-elseif — pilih yang paling mudah dibaca timmu.
Common Pitfalls
<?php
// ⚠️ Switch uses loose comparison (==)
$value = "10";
switch ($value) {
case 10:
echo "Matched as integer 10"; // Ini akan match!
break;
case "10":
echo "Matched as string 10";
break;
}
// Output: Matched as integer 10
// ⚠️ Missing break = fall-through (sering jadi bug)
$option = "edit";
switch ($option) {
case "view":
echo "Viewing...";
// forgot break!
case "edit":
echo "Editing..."; // eksekusi mulai dari sini
// forgot break!
case "delete":
echo "Deleting..."; // lalu menetes ke sini!
break;
}
// Output: Editing...Deleting... (BUG! "Deleting..." tidak seharusnya muncul)
// Catatan: jika $option = "delete", output hanya "Deleting..." —
// switch melompat langsung ke case yang cocok, case di atasnya dilewati.
?>
Pitfall lain yang jarang disadari: tipe data case dicampur. Jika kamu mencampur case 1 (int) dan case "1" (string), hanya case pertama yang akan pernah cocok karena loose comparison. Selalu jaga konsistensi tipe nilai di semua case.
Pro Tips
- Selalu akhiri case dengan
breakkecuali memang sengaja fall-through (dan beri komentar// sengaja fall-through). - Kelompokkan case tanpa body untuk nilai yang berperilaku sama — ini bentuk fall-through yang aman dan jelas.
- Sediakan
defaultuntuk menangkap nilai tak terduga, apalagi jika nilai berasal dari input user. - Untuk PHP 8+, pertimbangkan
matchjika kamu butuh: strict comparison, nilai balik langsung, atau tanpabreak. - Jangan gunakan
switchuntuk rentang nilai —if-elseifjauh lebih jelas untuk itu.
Exercise
- Buat switch untuk convert angka ke nama hari (1=Minggu, 2=Senin, dst)
- Buat calculator sederhana dengan switch untuk operasi + - * /
- Kenapa output dari kode berikut?:
<?php
switch ("php") {
case "php":
echo "PHP";
case "Python":
echo "Python";
break;
}
?>
- Buat switch yang menerima kode status HTTP (
200,404,500) dan mencetak pesan ramah ("OK", "Halaman tidak ditemukan", "Server error"). Sertakandefaultuntuk kode lain. - Perbaiki bug fall-through pada kode role di materi di atas, lalu tulis ulang versinya menggunakan
matchexpression (PHP 8+).
Summary
| Konsep | Poin Kunci |
|---|---|
switch | Membandingkan satu nilai dengan banyak case |
break | Menghentikan eksekusi switch; lupa break = bug fall-through |
default | Jalur cadangan saat tidak ada case cocok |
| Loose comparison | switch memakai ==, jadi "10" cocok dengan case 10 |
| Fall-through | Bisa disengaja untuk mengelompokkan nilai |
| vs If-Else | Switch untuk enum-like, if-else untuk range & kondisi kompleks |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 3
Uji pemahamanmu tentang Struktur Kontrol