Menu

Ekspresi match PHP: match vs switch, match(true)

match ($x) { 1, 2 => 'low', default => 'other' } membandingkan sebuah nilai dengan === yang strict, mengembalikan hasil dari arm pertama yang cocok, dan melempar UnhandledMatchError saat tidak ada yang cocok. Membahas match vs switch, match(true), dan match dengan enum.

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

match ($value) { ... } membandingkan sebuah nilai dengan daftar arm memakai === yang strict dan mengembalikan hasil dari arm pertama yang cocok. Beberapa nilai bisa berbagi satu arm, default menangkap sisanya, dan jika tidak ada yang cocok, PHP melempar UnhandledMatchError.

Perhatikan titik koma setelah kurung kurawal penutup: match adalah ekspresi, seperti 1 + 2, jadi keseluruhannya adalah satu pernyataan assignment. Setiap arm berbentuk values => result, dipisahkan koma, dan koma di akhir setelah arm terakhir diperbolehkan.

Banyak nilai dalam satu arm

Tulis nilai-nilainya dengan koma. Arm itu cocok jika subjeknya identik (===) dengan salah satunya.

Mengembalikan match langsung dari fungsi, seperti di sini, adalah cara paling umum memakainya.

match vs switch

Pemetaan yang sama ditulis dengan dua cara, dengan satu input yang menunjukkan perbedaan terbesarnya: perbandingan. switch memakai ==, jadi string "1" cocok dengan case 1. match memakai ===, jadi tidak cocok.

matchswitch
Perbandinganstrict ===loose ==
Hasilmengembalikan nilaipernyataan, tidak mengembalikan apa pun
Fallthroughtidak pernahya, sampai break
Beberapa nilai1, 2 =>case 1: case 2: yang ditumpuk
Tidak ada yang cocokmelempar UnhandledMatchErrortidak melakukan apa pun
Isi sebuah cabangsatu ekspresipernyataan berapa pun

Pakai match saat kamu mengubah satu nilai menjadi nilai lain. Tetap pakai switch saat sebuah cabang butuh beberapa pernyataan atau saat fallthrough memang tujuannya; halaman switch membahas kedua kasus itu.

UnhandledMatchError: saat tidak ada arm yang cocok

Tanpa arm default, nilai yang tidak cocok dengan apa pun adalah error, bukan null yang diam-diam. Itu justru fitur: kode status baru atau salah ketik akan gagal dengan jelas alih-alih lolos begitu saja.

PHP berhenti dengan PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. Pengaturan development (dengan zend.exception_ignore_args dimatikan) menyebut nilainya: Unhandled match case 'XL'. Perbaiki dengan menambahkan default => 'other', atau dengan menangkap error-nya di tempat yang memang bisa menerima nilai yang tidak dikenal:

match(true) untuk rentang dan kondisi

match membandingkan subjek dengan setiap arm, jadi jika subjeknya true, setiap arm bisa berupa kondisi. Kondisi pertama yang bernilai persis true yang menang.

Ada dua detail di blok itu. throw adalah ekspresi sejak PHP 8, jadi bisa menjadi hasil sebuah arm. Dan karena perbandingannya strict, setiap kondisi harus mengembalikan boolean sungguhan: arm seperti $name => ... tidak pernah cocok dengan true meskipun $name berupa string yang tidak kosong. Hanya arm yang cocok yang dievaluasi, jadi throw hanya berjalan untuk umur yang negatif.

match dengan enum

match dan enum cocok dipadukan: di dalam method enum, match ($this) memetakan setiap case ke sebuah nilai. Lihat enum PHP untuk penjelasan tentang enum itu sendiri.

Di sini sengaja tidak ada default. Jika seseorang menambahkan case kelima nanti, memanggil color() padanya akan melempar error alih-alih mengembalikan warna yang salah.

Beberapa pernyataan dalam satu arm

Sebuah arm berisi satu ekspresi, jadi 'save' => { ...; ... } bukan PHP yang valid. Pindahkan pekerjaannya ke sebuah fungsi lalu panggil dari arm itu. Fungsi milik arm yang tidak cocok tidak pernah dipanggil.

Ubah $format menjadi 'json' atau 'xml' lalu jalankan lagi.

Pertanyaan yang sering diajukan

Apa perbedaan match dan switch di PHP?

match membandingkan dengan === yang strict, mengembalikan nilai, tidak pernah jatuh ke arm berikutnya, menerima beberapa nilai yang dipisahkan koma per arm, dan melempar UnhandledMatchError saat tidak ada arm yang cocok. switch membandingkan dengan == yang loose, berupa pernyataan yang tidak mengembalikan apa pun, jatuh ke case berikutnya tanpa break, dan diam-diam tidak melakukan apa pun saat tidak ada case yang cocok.

Apa yang terjadi saat tidak ada arm yang cocok di ekspresi match PHP?

PHP melempar UnhandledMatchError. Tambahkan arm default => ... untuk menangani semua nilai lainnya, atau tangkap error-nya dengan try { ... } catch (\UnhandledMatchError $e) { ... }.

Bagaimana cara memakai match dengan kondisi seperti lebih besar dari di PHP?

Cocokkan dengan true: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. Setiap arm adalah sebuah kondisi, dan kondisi pertama yang bernilai persis true yang menang.

Bisakah satu arm match menjalankan beberapa pernyataan di PHP?

Tidak, setiap arm adalah satu ekspresi. Taruh pernyataan-pernyataannya di fungsi atau method lalu panggil dari arm tersebut, misalnya 'export' => exportCsv($rows).

Versi PHP mana yang menambahkan match?

PHP 8.0. Di PHP 7, logika yang sama butuh pernyataan switch atau lookup array seperti $labels[$status] ?? 'Unknown'.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai