Kodealgo

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:

  1. Sintaks
  2. Contoh
  3. match Dibandingkan secara Ketat

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.