match PHP
match
merupakan salah satu percabangan baru yang bisa kita gunakan di PHP 8, ini bisa menjadi alternatif dari switch
. Sama halnya seperti switch
, dengan match
kita dapat membandingkan nilai dengan nilai tertentu untuk melakukan aksi yang sesuai.
Bedanya, nilai switch
dibandingkan secara longgar menggunakan operator perbandingan kesetaraan longgar (==
), sedangkan match
dibandingkan secara ketat menggunakan operator kesetaraan ketat (===
), oleh karena itu, agar aksi dieksekusi nilai dan tipe data harus sama persis.
Selain itu, sintaks yang dibuat dengan percabangan match
juga lebih singkat jika dibandingkan dengan switch
, dan percabangan ini juga dapat mengembalikan nilai yang sesuai dengan aksi yang kita tentukan.
Berikut beberapa topik terkait match
yang akan kita bahas:
Sintaks
nilaiKembalian = match (nilai) {
nilaiPembanding1 => aksi1,
nilaiPembanding2 => aksi2,
nilaiPembanding3, nilaiPembandingN => aksi3,
default => aksiDefault,
};
nilai
adalah nilai yang akan dibandingkan dengan nilaiPembanding
secara berurutan dari atas ke bawah. Misalnya, jika nilai
ketika dibandingkan menggunakan operator kesetaraan ketat (===
) dengan nilaiPembanding1
menghasilkan nilai true
maka aksi1
akan dieksekusi dan interpreter akan langsung keluar dari percabangan.
Jika aksi
mengembalikan nilai, maka nilai tersebut akan ditampung oleh nilaiKembalian
, jika tidak, kita bisa menghilangkan nilaiKembalian =
.
nilaiPembanding
dapat digabungkan dalam satu baris dipisahkan dengan koma, dalam contoh diatas misalnya nilaiPembanding3, nilaiPembandingN
dimana jika nilai
sama dengan nilaiPembanding3
atau nilaiPembandingN
maka aksi3
akan dieksekusi.
Jika tidak ada nilaiPembanding
yang cocok dengan nilai
, maka aksiDefault
akan diesekusi.
nilaiPembanding
sebetulnya tidak harus berupa nilai tunggal eksplisit, kita bisa melakukan perbandingan yang menghasilkan nilai boolean, tapi nilai
harus berupa boolean true
agar interpreter bisa masuk ke dalam blok match
.
Contoh
Misalnya, kita ingin mengkonversi hari dari angka ke hari dalam kata, jadi jika $day
bernilai 1
berarti senin
, jika 2
berarti selasa
, dan seterusnya sampai 7
untuk hari minggu
. Jika $day
diluar rentang 1-7 kembalikan pesan kesalahan.
$day = 3;
$result = match($day) {
1 => "senin",
2 => "selasa",
3 => "rabu",
4 => "kamis",
5 => "jumat",
6 => "sabtu",
7 => "minggu",
default => "Hari $day tidak ditemukan"
};
var_dump($result); // string(4) "rabu"
Karena dalam contoh diatas $day
bernilai 3
maka match
akan mengembalikan string rabu
. Kita dapat mengubah nilai dari variabel $day
diluar rentang 1-7 untuk untuk membuktikan aksi default dijalankan, silakan dicoba.
Seperti yang telah disebutkan sebelumnya, kita juga dapat menyatukan beberapa nilai pembanding dalam satu baris untuk melakukan aksi yang sama ketika salah satunya sesuai, mari kita lihat contoh berikut.
Dalam contoh kali ini kita ingin match
mengembalikan string hari kerja
ketika $day
bernilai 1-5, dan hari libur
ketika bernilai 6-7, diluar rentang tersebut kembalikan pesan kesalahan.
$day = 7;
$result = match($day) {
1, 2, 3, 4, 5 => "hari kerja",
6, 7 => "hari libur",
default => "Hari $day tidak ditemukan"
};
var_dump($result); // string(10) "hari libur"
match
Dibandingkan secara Ketat
Salah satu hal yang perlu diketahui saat menggunakan match
adalah bagaimana nilai dibandingkan, alih-alih dibandingkan dengan menggunakan operator kesetaraan longgar (==
) seperti switch
, match
dibandingkan menggunakan operator kesetaraan ketat (===
).
Mari kita buktikan.
$day = 1;
$result = match($day) {
"1" => "senin",
default => gettype($day) . " $day tidak ditemukan"
};
var_dump($result); // string(25) "integer 1 tidak ditemukan"
Disini match
mengembalikan aksi default
karena nilai $day
adalah integer 1
dan nilai pembanding untuk aksi senin
adalah string "1"
, jadi PHP akan melakukan perbandingan seperti berikut: 1 === "1"
, karena hasilnya adalah fasle
maka tidak mengembalikan "senin"
tetapi string yang berada di aksi default
.