BAB 3: STRUKTUR KONTROL

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
<?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:

CaseHasil
case MondayHari Senin
case TuesdayHari Selasa
case WednesdayHari Rabu
defaultHari lain

Basic Switch

php
<?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:

BagianContohFungsi
Ekspresiswitch ($day)Nilai yang akan dibandingkan
Casecase "Monday":Nilai pembanding; jika cocok, eksekusi dimulai dari sini
Bodyecho "Hari Senin";Kode yang dijalankan
break;break;Menghentikan switch, keluar dari blok
defaultdefault:Dijalankan jika tidak ada case yang cocok
💡Tip

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
<?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.

⚠️Perhatian

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
<?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
<?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
<?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 0 akan cocok dengan string falsy seperti "", "0", dan null — kombinasi yang berbahaya.
  • Jika kamu butuh perbandingan strict, gunakan match expression (lihat materi 3-4) atau if-else dengan ===.
php
<?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

?>
⚠️Perhatian

Jangan pernah mengandalkan switch untuk membedakan 0, "0", "", dan null — semuanya cocok dengan case 0 karena loose comparison.

Alternative Syntax

php
<?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

AspekSwitchIf-Else
ReadabilityLebih clean untuk many casesOK untuk 2-3 conditions
PerformanceFaster (single evaluation)Evaluates each condition
ComparisonLoose (==) comparisonBisa strict (===)
FlexibilityLimitedCan use complex conditions
php
<?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:

SituasiPilih
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 balikmatch (PHP 8+)

Switch dengan Ekspresi di Case

Case tidak harus berupa literal — bisa juga ekspresi, selama hasilnya dibandingkan dengan ekspresi switch:

php
<?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
<?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

  1. Selalu akhiri case dengan break kecuali memang sengaja fall-through (dan beri komentar // sengaja fall-through).
  2. Kelompokkan case tanpa body untuk nilai yang berperilaku sama — ini bentuk fall-through yang aman dan jelas.
  3. Sediakan default untuk menangkap nilai tak terduga, apalagi jika nilai berasal dari input user.
  4. Untuk PHP 8+, pertimbangkan match jika kamu butuh: strict comparison, nilai balik langsung, atau tanpa break.
  5. Jangan gunakan switch untuk rentang nilai — if-elseif jauh lebih jelas untuk itu.

Exercise

  1. Buat switch untuk convert angka ke nama hari (1=Minggu, 2=Senin, dst)
  2. Buat calculator sederhana dengan switch untuk operasi + - * /
  3. Kenapa output dari kode berikut?:
php
<?php
switch ("php") {
    case "php":
        echo "PHP";
    case "Python":
        echo "Python";
        break;
}
?>
  1. Buat switch yang menerima kode status HTTP (200, 404, 500) dan mencetak pesan ramah ("OK", "Halaman tidak ditemukan", "Server error"). Sertakan default untuk kode lain.
  2. Perbaiki bug fall-through pada kode role di materi di atas, lalu tulis ulang versinya menggunakan match expression (PHP 8+).

Summary

KonsepPoin Kunci
switchMembandingkan satu nilai dengan banyak case
breakMenghentikan eksekusi switch; lupa break = bug fall-through
defaultJalur cadangan saat tidak ada case cocok
Loose comparisonswitch memakai ==, jadi "10" cocok dengan case 10
Fall-throughBisa disengaja untuk mengelompokkan nilai
vs If-ElseSwitch untuk enum-like, if-else untuk range & kondisi kompleks

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 3

Uji pemahamanmu tentang Struktur Kontrol