Menu

Switch Case di PHP: case, break, default, dan Fallthrough

switch ($value) membandingkan satu nilai dengan daftar label case dan menjalankan kode mulai dari kecocokan pertama sampai bertemu break. Membahas beberapa case untuk satu blok, fallthrough, default, switch(true), dan kenapa switch memakai perbandingan longgar ==.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

switch ($value) membandingkan satu nilai dengan daftar label case dan menjalankan kode di bawah label pertama yang cocok. Setiap case diakhiri dengan break; default menangani semua nilai yang tidak cocok dengan apa pun.

Ubah $day menjadi 'fri', 'sun', atau 'wed' lalu jalankan lagi. Case default tidak perlu break kalau letaknya paling akhir.

Beberapa case untuk satu blok

Untuk menjalankan kode yang sama bagi beberapa nilai, tumpuk label case tanpa apa pun di antaranya. Label yang cocok akan lanjut ke kode di bawahnya.

Berbeda dengan match, switch tidak punya sintaks koma case 'jpg', 'jpeg':. Label yang ditumpuk adalah satu-satunya cara.

Fallthrough: yang terjadi tanpa break

break adalah yang menghentikan switch. Tanpa itu, PHP menjalankan case yang cocok lalu terus masuk ke setiap case di bawahnya, mengabaikan label-labelnya, sampai bertemu break atau akhir switch.

Di sini fallthrough-nya disengaja: setiap paket mendapat fiturnya sendiri ditambah semua fitur dari paket yang lebih murah. Kalau kamu menulisnya dengan sengaja, tambahkan komentar seperti // no break supaya pembaca berikutnya tidak "memperbaikinya". Kalau tidak disengaja, break yang terlupa adalah salah satu bug switch yang paling umum.

switch memakai perbandingan longgar (==)

Setiap case diperiksa dengan ==, bukan ===. String numerik cocok dengan angka, null cocok dengan false dan "", dan true cocok dengan nilai apa pun yang dianggap true. Ketuk sel-selnya untuk membandingkan kedua operator.

switch membandingkan dengan ==, match membandingkan dengan ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Akibatnya dalam praktik: string input "1" dari formulir masuk ke case 1: tanpa konversi apa pun, dan sering kali memang itulah yang kamu inginkan. Tetapi switch (true) dengan string yang tidak kosong, atau null yang bertemu case false:, bisa memilih case yang tidak kamu duga.

Perhatikan baris null: nilainya tidak pernah sampai ke case false:, karena null == 0 sudah bernilai true dan case 0: ada lebih dulu. Dengan perbandingan longgar, urutan case mengubah hasilnya. Sejak PHP 8, 0 == "a" bernilai false (di PHP 7 nilainya true), jadi string non-numerik tidak lagi cocok dengan case 0:. Kalau kamu butuh ===, pakai ekspresi match, yang dibahas di akhir halaman ini.

switch(true) untuk rentang dan kondisi

Label case bisa berupa ekspresi apa pun. Dengan switch (true), setiap case adalah sebuah kondisi, dan kondisi pertama yang sama dengan true yang menang.

Pastikan setiap case benar-benar boolean. Karena perbandingannya longgar, case $name: akan cocok setiap kali $name berupa string yang tidak kosong.

switch di dalam loop: break dan continue

Di dalam loop, break di switch hanya keluar dari switch, bukan dari loop-nya. Untuk menghentikan loop, pakai break 2. continue di dalam switch berperilaku seperti break, dan PHP memberi peringatan saat kompilasi: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Tulis continue 2 untuk lompat ke iterasi loop berikutnya.

switch vs match

PHP 8 menambahkan match, yang mencakup sebagian besar pemakaian switch dengan kode yang lebih sedikit. Ekspresi ini membandingkan dengan ===, mengembalikan sebuah nilai, tidak pernah fallthrough, mengizinkan beberapa kondisi yang dipisahkan koma, dan melempar UnhandledMatchError saat tidak ada yang cocok, jadi case yang terlupa tidak bisa lolos diam-diam.

Tetap pakai switch kalau sebuah case butuh beberapa pernyataan, atau kalau fallthrough memang tujuannya, seperti pada contoh paket di atas. Untuk memetakan sebuah nilai ke sebuah hasil, match lebih singkat dan lebih aman.

Pertanyaan yang sering diajukan

Bagaimana cara memakai beberapa case untuk satu blok di switch PHP?

Tumpuk label case tanpa kode di antaranya: case 'sat': case 'sun': echo 'weekend'; break;. Setiap label akan lanjut ke kode yang dipakai bersama. PHP tidak punya sintaks case 'sat', 'sun': untuk switch; bentuk dengan koma itu milik match.

Apakah switch di PHP memakai perbandingan ketat?

Tidak. switch membandingkan dengan == yang longgar, jadi case '1': cocok dengan integer 1 dan case 0: cocok dengan '0'. Untuk perbandingan ketat ===, pakai ekspresi match atau switch (true) dengan === di setiap case.

Apa yang terjadi kalau break lupa ditulis di switch PHP?

Eksekusinya jatuh ke bawah (fallthrough): setelah case yang cocok, PHP terus menjalankan kode dari setiap case di bawahnya sampai bertemu break, return, atau akhir switch. Kadang memang disengaja, tetapi biasanya itu bug.

Bisakah switch PHP memeriksa rentang seperti lebih besar dari?

Bisa, dengan switch (true): setiap case berisi kondisi seperti case $score >= 90:, dan kondisi pertama yang bernilai true yang dijalankan. Ekspresi match (true) melakukan hal yang sama dengan perbandingan ketat dan mengembalikan sebuah nilai.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai