Ketika sebuah percabangan hanya memetakan satu nilai ke beberapa hasil berbeda — kode bahasa menjadi sapaan, kode negara menjadi nama region — rantai if-elseif terasa bertele-tele. PHP 8.0 memperkenalkan match sebagai alternatif yang lebih ringkas dan lebih aman. Ada dua sifat fundamental yang perlu Anda pegang sejak awal: match adalah ekspresi yang menghasilkan nilai, dan match membandingkan secara ketat dengan operator ===. Pada chapter ini kita bedah kedua sifat tersebut, pola match (true) untuk kondisi rentang, perilaku ketika tidak ada kecocokan, lalu menutup dengan tabel perbandingan melawan switch.

Bentuk Dasar match #

Ekspresi match dimulai dengan kata kunci match, diikuti subjek dalam kurung, lalu daftar arm di dalam kurung kurawal. Interpreter mengevaluasi subjek tepat satu kali, membandingkannya dengan kondisi tiap arm dari atas ke bawah, dan arm pertama yang cocok menang — arm setelahnya tidak diperiksa sama sekali. Nilai di kanan tanda => pada arm yang menang menjadi hasil seluruh ekspresi match.

php
<?php
$kodeBahasa = "id";

$sapaan = match ($kodeBahasa) {
    "id" => "Selamat pagi",
    "en" => "Good morning",
    "ja" => "Ohayou gozaimasu",
};

echo $sapaan, "\n";

Output yang Dihasilkan:

text
Selamat pagi

Mari kita bedah contoh di atas:

  1. Baris 6 (match ($kodeBahasa)): nilai "id" dievaluasi satu kali sebagai subjek pencocokan.
  2. Arm "id" => "Selamat pagi": subjek dibandingkan dengan "id" memakai ===; karena tipe dan nilai sama, arm ini menang dan arm "en" serta "ja" dilewati.
  3. Titik koma di baris 10: wajib ada karena match adalah ekspresi, sama seperti penugasan variabel biasa.

Arm default berperan sebagai jaring pengaman ketika tidak ada satu pun kondisi yang cocok; kita akan lihat betapa pentingnya peran ini pada bagian khusus di bawah.

Match Sebagai Ekspresi #

Perbedaan terbesar match dibanding switch adalah kategorinya: match adalah ekspresi yang menghasilkan nilai, bukan statement yang hanya menjalankan blok kode. Konsekuensinya, hasil match bisa langsung disimpan ke variabel seperti contoh pertama, dikirim sebagai argumen function, dicetak langsung, dan nanti dikembalikan dengan return — semuanya tanpa variabel penampung sementara.

php
<?php
$level = 2;

echo "Level Anda: ", match ($level) {
    1 => "pemula",
    2 => "menengah",
    3 => "mahir",
    default => "tidak dikenal",
}, "\n";

Output yang Dihasilkan:

text
Level Anda: menengah

Pada contoh di atas, hasil match langsung menjadi argumen kedua echo — tidak ada variabel perantara. Setiap arm juga tidak memerlukan break: begitu satu arm menang, eksekusi keluar dari match sepenuhnya, sehingga fall-through antar-cabang yang sering menghantui switch tidak mungkin terjadi di sini.

Perbandingan Ketat Tanpa Type Juggling #

match membandingkan subjek dengan kondisi tiap arm memakai operator ===: nilai dan tipe data harus sama. Ini kontras dengan switch yang memakai perbandingan longs == dan rela melakukan type juggling — misalnya, switch ("1") akan masuk ke case 1 karena string numerik "1" dianggap sama dengan integer 1. Dengan match, kedua nilai itu berbeda dan tidak akan saling cocok.

php
<?php
$input = "1";

$hasil = match ($input) {
    1 => "Input adalah integer 1",
    "1" => 'Input adalah string "1"',
    default => "Input tidak dikenali",
};

echo $hasil, "\n";

Output yang Dihasilkan:

text
Input adalah string "1"

Data dari form web dan argumen CLI pada umumnya datang sebagai string, sehingga perbedaan ketat seperti ini sangat relevan dalam praktik. Pada contoh di atas, subjek $input bernilai string "1", sehingga arm kedua yang menang — bukan arm pertama yang bertipe integer. Jika Anda memang ingin menerima kedua bentuk, konversikan tipenya secara eksplisit sebelum mencocokkan, misalnya match ((int) $input).

Beberapa Nilai dalam Satu Arm #

Kadang beberapa nilai berbeda berbagi hasil yang sama. Alih-alih menduplikasi arm, match memungkinkan kita mendaftarkan beberapa kondisi dalam satu arm, dipisah koma — maknanya sama dengan ATAU logis.

php
<?php
$hariIni = "Minggu";

$jenisHari = match ($hariIni) {
    "Sabtu", "Minggu" => "akhir pekan",
    default => "hari kerja",
};

echo "Hari ini adalah hari $jenisHari.\n";

Output yang Dihasilkan:

text
Hari ini adalah hari akhir pekan.

Interpreter membandingkan "Minggu" dengan "Sabtu" terlebih dahulu (tidak cocok), lalu dengan "Minggu" (cocok), sehingga hasil arm tersebut yang dipakai. Bentuk koma ini jauh lebih ringkas dibanding case "Sabtu": case "Minggu": dua baris pada switch.

Idiom match(true) untuk Kondisi Rentang #

Kondisi arm dibandingkan terhadap subjek dengan ===, jadi kita tidak bisa menulis $nilaiAngka >= 90 => "A" pada match ($nilaiAngka) — hasil perbandingan true atau false tidak akan pernah identik dengan angka. Solusi idiomatisnya: jadikan true sebagai subjek, lalu isi tiap arm dengan ekspresi boolean. Arm yang bernilai true adalah pemenangnya.

php
<?php
$nilaiAngka = 87;

$predikat = match (true) {
    $nilaiAngka >= 90 => "A",
    $nilaiAngka >= 80 => "B",
    $nilaiAngka >= 70 => "C",
    default => "D",
};

echo "Nilai $nilaiAngka mendapat predikat $predikat.\n";

Output yang Dihasilkan:

text
Nilai 87 mendapat predikat B.

Evaluasi tetap berurutan dari atas: $nilaiAngka >= 90 menghasilkan false (dilewati), lalu $nilaiAngka >= 80 menghasilkan true sehingga predikat "B" menang. Perilaku ini identik dengan rantai elseif, tetapi seluruh keputusan terangkum sebagai satu ekspresi yang menghasilkan nilai.

Ketika Tidak Ada Arm yang Cocok #

Jika tidak ada arm yang cocok dan arm default tidak ada, PHP melempar UnhandledMatchError — sebuah error fatal yang menghentikan eksekusi skrip. Contoh berikut sengaja membiarkan subjek "sg" tanpa arm yang menangkapnya; jalankan dan perhatikan pesan errornya.

php
<?php
$kodeNegara = "sg";

$region = match ($kodeNegara) {
    "id" => "Asia Tenggara",
    "my" => "Asia Tenggara",
};

echo $region, "\n";

Output yang Dihasilkan:

text

Fatal error: Uncaught UnhandledMatchError: Unhandled match case 'sg' in /home/z/my-project/php-course/content/php/control-flow/match-expression/.verify_tmp.php:4
Stack trace:
#0 {main}
  thrown in /home/z/my-project/php-course/content/php/control-flow/match-expression/.verify_tmp.php on line 4

Pesan fatal error tersebut menyebut nilai persis yang gagal dicocokkan (Unhandled match case 'sg') beserta nama berkas dan baris tempat match ditulis — nama berkas pada pesan tentu bergantung pada lokasi skrip Anda. Perilaku gagal-kencang (fail fast) ini berbeda dengan switch, yang hanya diam melompati seluruh blok ketika tidak ada kecocokan. Kebisingan yang tampak sebagai kelemahan itu justru melindungi kita: kesalahan pemetaan terdeteksi di tempat kejadian, bukan menjadi bug senyap di cabang lain. Solusinya sederhana — tambahkan arm untuk nilai yang relevan, atau tutup dengan default seperti pada contoh-contoh sebelumnya.

Perbandingan match dan switch #

Aspekmatchswitch
KategoriEkspresi — menghasilkan nilaiStatement — menjalankan blok kode
PerbandinganKetat ===Longs == dengan type juggling
breakTidak diperlukanWajib di tiap case; lupa berarti fall-through
Tidak ada kecocokanUnhandledMatchError (fatal)Blok dilewati diam-diam
Beberapa nilai per cabangKoma: "Sabtu", "Minggu" => ...case "Sabtu": case "Minggu":
Isi cabangSatu ekspresi nilaiBlok kode bebas multi-baris

Dari tabel di atas kita bisa menarik panduan praktis. Pilih match ketika Anda memetakan satu nilai ke hasil-hasil pendek dan menginginkan perbandingan ketat. Gunakan switch ketika tiap cabang perlu menjalankan rangkaian statement panjang. Gunakan rantai if-elseif ketika kondisinya campuran dan tidak semuanya membandingkan subjek yang sama. switch sendiri akan kita bedah lebih lanjut pada chapter khusus di section ini.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.

Ringkasan #

match memetakan satu subjek ke hasil dengan perbandingan === yang ketat, tanpa break, tanpa fall-through, dan langsung menghasilkan nilai yang bisa disimpan maupun dicetak. Beberapa nilai dapat berbagi satu arm lewat koma, kondisi rentang ditangani idiom match (true), dan ketiadaan kecocokan tanpa default memicu UnhandledMatchError yang gagal-kencang. Dengan bekal percabangan yang lengkap — if, elseif, kondisi bersarang, hingga match — kita siap berpindah ke sisi lain control flow: perulangan, dimulai dari while pada chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php
// contoh.php — rangkuman contoh Chapter Match Expression.
// Jalankan dengan: php contoh.php

// 1. Bentuk dasar: hasil match disimpan ke variabel
$kodeBahasa = "id";

$sapaan = match ($kodeBahasa) {
    "id" => "Selamat pagi",
    "en" => "Good morning",
    "ja" => "Ohayou gozaimasu",
};

echo $sapaan, "\n";

// 2. Perbandingan ketat: string "1" tidak sama dengan integer 1
$input = "1";

$hasil = match ($input) {
    1 => "Input adalah integer 1",
    "1" => 'Input adalah string "1"',
    default => "Input tidak dikenali",
};

echo $hasil, "\n";

// 3. Beberapa nilai dalam satu arm
$hariIni = "Minggu";

$jenisHari = match ($hariIni) {
    "Sabtu", "Minggu" => "akhir pekan",
    default => "hari kerja",
};

echo "Hari ini adalah hari $jenisHari.\n";

// 4. Idiom match(true) untuk pemeriksaan rentang
$nilaiAngka = 87;

$predikat = match (true) {
    $nilaiAngka >= 90 => "A",
    $nilaiAngka >= 80 => "B",
    $nilaiAngka >= 70 => "C",
    default => "D",
};

echo "Nilai $nilaiAngka mendapat predikat $predikat.\n";

// 5. match sebagai ekspresi langsung di dalam echo
$level = 2;

echo "Level Anda: ", match ($level) {
    1 => "pemula",
    2 => "menengah",
    3 => "mahir",
    default => "tidak dikenal",
}, "\n";