dasarkondisiPemula3 mnt baca

switch dan match

Percabangan banyak pilihan: switch klasik dan match expression yang lebih ketat di PHP 8.

Analogi: Operator Telepon vs Mesin Penjawab

if/elseif seperti operator telepon yang menanyai satu per satu: "apakah ini? bukan? apakah ini?". Kalau pilihannya banyak (misalnya 7 hari dalam seminggu), pertanyaannya panjang dan melelahkan. switch seperti mesin penjawab otomatis: "tekan 1 untuk Senin, 2 untuk Selasa..." langsung melompat ke pilihan yang cocok. match (PHP 8) adalah versi modernnya: lebih ketat, lebih ringkas, dan mengembalikan nilai.

Kenapa Tidak Selalu Pakai if?

Bisa saja semua ditulis dengan if/elseif, tapi saat satu variabel dibandingkan dengan banyak nilai tetap, kode menjadi menara elseif yang sulit dibaca. switch/match menyatakan maksud dengan lebih jujur: "saya mencocokkan SATU nilai dengan BANYAK kemungkinan". Kode yang jujur lebih mudah dibaca dan lebih kecil kemungkinan salah.

php
<?php
// Contoh 1: switch klasik (perhatikan break!)
$hari = "Senin";

switch ($hari) {
    case "Senin":
        echo "Awal minggu, semangat!";
        break;
    case "Jumat":
        echo "Besok libur!";
        break;
    case "Sabtu":
    case "Minggu":   // dua case boleh berbagi satu aksi
        echo "Waktunya istirahat.";
        break;
    default:
        echo "Hari kerja biasa.";
}

break adalah bagian paling penting di switch: tanpa break, PHP terus meluncur ke case berikutnya (disebut fallthrough). Kadang fallthrough disengaja (seperti Sabtu/Minggu di atas), tapi 99% bug switch berasal dari break yang terlupa.

php
<?php
// Contoh 2: match, cara modern PHP 8 (lebih disarankan)
$hari = "Jumat";

$pesan = match ($hari) {
    "Senin" => "Awal minggu, semangat!",
    "Jumat" => "Besok libur!",
    "Sabtu", "Minggu" => "Waktunya istirahat.",  // beberapa nilai, satu panah
    default => "Hari kerja biasa.",
};

echo $pesan;

match unggul di tiga hal: (1) tidak butuh break (tidak ada fallthrough), (2) langsung mengembalikan nilai sehingga bisa disimpan ke variabel, (3) perbandingannya ketat (===, bukan == longgar). Untuk kode baru, biasakan match.

Kesalahan Umum Pemula

Salah: lupa break di switch.

php
<?php
$nilai = "B";
switch ($nilai) {
    case "A":
        echo "Sempurna";
    case "B":          // SALAH: tidak ada break di atas!
        echo "Bagus";
        break;
}
// Hasil: "SempurnaBagus" (keduanya tampil!)

Karena tidak ada break setelah case "A", eksekusi meluncur ke case "B". Benar: selalu akhiri tiap case dengan break kecuali kamu memang sengaja ingin fallthrough (dan beri komentar penjelas).

Salah: memakai switch untuk kondisi rentang.

php
<?php
switch (true) {   // trik yang membingungkan, hindari sebagai pemula
    case $nilai >= 90:
        ...
}

switch/match dirancang untuk mencocokkan satu nilai dengan nilai-nilai tetap, bukan untuk rentang atau kondisi kompleks. Untuk rentang nilai (seperti predikat A-E), if/elseif tetap pilihan yang tepat.

Salah: mengira match sama longgarnya dengan switch. Justru sebaliknya: match memakai perbandingan ketat ===. match("10") tidak akan cocok dengan case 10 (int). Ini sebenarnya fitur keamanan, tapi bisa membingungkan kalau kamu belum tahu dan datamu bertipe string dari form.

Kapan Memakai Apa?

Panduan memilih di antara tiga alat percabangan:

  • if/elseif: kondisi beragam (rentang nilai, kombinasi boolean, perbandingan kompleks). Paling fleksibel.
  • switch: satu variabel dicocokkan ke banyak nilai tetap, dan tiap case butuh beberapa baris aksi. Waspadai break.
  • match: satu nilai menjadi satu hasil (mapping). Paling ringkas dan aman untuk kode baru.

Contoh mapping yang pas untuk match: kode menjadi nama hari, status menjadi label, role menjadi hak akses. Contoh yang TIDAK pas: cek rentang nilai atau validasi multi-syarat (tetap pakai if).

Satu catatan: match melempar UnhandledMatchError jika tidak ada case cocok dan tidak ada default. Selalu sediakan default kecuali kamu memang ingin error tegas saat nilai tak dikenal.

Refaktor: Dari if Panjang ke match

Latihan refaktor yang bagus: cari rantai if/elseif yang membandingkan satu variabel dengan nilai tetap, lalu ubah menjadi match:

php
<?php
// Sebelum: menara elseif
if ($kode === "ID") { $bahasa = "Indonesia"; }
elseif ($kode === "EN") { $bahasa = "Inggris"; }
else { $bahasa = "Tidak dikenal"; }

// Sesudah: satu match yang jelas
$bahasa = match ($kode) {
    "ID" => "Indonesia",
    "EN" => "Inggris",
    default => "Tidak dikenal",
};

Hasilnya lebih pendek, tidak ada risiko lupa break, dan perbandingan otomatis ketat (===).

Catatan teknis: match adalah expression (menghasilkan nilai), sedangkan switch adalah statement (tidak menghasilkan nilai). Karena itu hasil match bisa langsung di-echo, disimpan ke variabel, atau dipakai sebagai argumen fungsi: echo match($hari) { ... };.

Tantangan

Pilih dengan match

Buat variabel $kode = "ID". Dengan match, petakan: "ID" ke "Indonesia", "MY" ke "Malaysia", "SG" ke "Singapura", default "Tidak dikenal". Tampilkan hasilnya.