(PHP 8)
match (eşleşme) ifadesi, bir değerin özdeşlik denetimine
dayalı olarak değerlendirmesini dallara ayırır. Switch deyimine benzer
şekilde, bir match ifadesinin birden çok alternatifle
karşılaştırılan bir özne ifadesi vardır. switch'in
aksine, üçlü ifadeler gibi bir değere indirgeyecektir.
switch aksine, karşılaştırma zayıf bir eşitlik
denetiminden (==) ziyade bir özdeşlik denetimidir (===). Eşleşme ifadeleri
PHP 8.0.0'dan itibaren mevcuttur.
Örnek 1 match ifadesinin yapısı
<?php
$dönüş değeri = match (özne_ifade) {
tekil_koşullu_ifade => dönüş_ifadesi,
koşullu_ifade1, koşullu_ifade2 => dönüş_ifadesi,
};
?>Örnek 2 match temel kullanım örneği
<?php
$yiyecek = 'börek';
$dönen_değer = match ($yiyecek) {
'meyva' => 'Bu bir meyva',
'çorba' => 'Bu bir çorba',
'börek' => 'Bu bir börek',
};
var_dump($dönen_değer);
?>Yukarıdaki örneğin çıktısı:
string(13) "Bu bir börek"
Örnek 3 Karşılaştırma işleçleriyle match kullanımı
<?php
$age = 18;
$output = match (true) {
$age < 2 => "Bebek",
$age < 13 => "Çocuk",
$age <= 19 => "Genç",
$age > 19 => "Yetişkin",
$age >= 65 => "Yaşlı"
};
var_dump($output);
?>Yukarıdaki örneğin çıktısı:
string(8) "Genç"
Bilginize:
matchifadesinin sonucunun kullanılmasına gerek yoktur.
Bilginize:
matchifadesi mutlaka bir noktalı virgül;ile sonlandırılmalıdır.
match ifadesi switch deyimine
benzemekle birlikte bazı önemli farklar vardır:
match kolu, değeri birebir (===)
değerlendirir, switch deyimin yaptığı gibi gevşekçe
değil.
match ifadesi bir değer döndürür.
match kolları switch deyimlerini
yaptığı gibi sonraki durumlarda başarısız olmaz.
match ifadesi kapsamlı olmalıdır.
switch deyimleri gibi, match ifadeleri
de eşleşmeleri sırayla değerlendirir. Başlangıçta hiçbir kod çalıştırılmaz.
Koşullu ifadeler yalnızca, tüm önceki koşullu ifadeler özne ifadeyle
eşleşmede başarısız olmuşlarsa değerlendirilir. Yalnızca eşleşen koşullu
ifadeye karşılık gelen dönüş ifadesi değerlendirilir. Örneğin:
<?php
$sonuç = match ($x) {
foo() => ...,
$this->bar() => ..., // foo() === $x ise $this->bar çağrılmaz
$this->baz => beep(), // $x === $this->baz olmadıkça beep() çağrılmaz
// vb.
};
?>
match ifadesinin kolları virgüllerle ayrılmış çok sayıda
ifade içerebilir. Bu bir mantıksal VEYA olup, aynı sağ taraflı çok sayıda
eşleşme kolu için bir kısa yoldur.
<?php
$sonuç = match ($x) {
// Bu eşleşme kolu:
$a, $b, $c => 5,
// Aşağıdaki üç eşleşme koluna eşdeğerdir:
$a => 5,
$b => 5,
$c => 5,
};
?>
Özel bir durum default kalıbıdır.
Bu kalıp evvelce eşleşmemiş herşeyle eşleşir.
Örnek:
<?php
$ifadeSonucu = match ($koşul) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};
?>Bilginize: Çok sayıda
defaultkalıbı birE_FATAL_ERRORhatasına (ölümcül hataya) yol açar.
match ifadesi kapsamlı olmalıdır. Konu ifadesi herhangi
bir eşleşme kolu tarafından işlenmezse, bir
UnhandledMatchError (başarısız eşleşme hatası)
yavrulanır.
Örnek 4 - Başarısız eşleşme hatası örneği
<?php
$özne = 5;
try {
match ($özne) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (\UnhandledMatchError $e) {
var_dump($e);
}
?>Yukarıdaki örneğin çıktısı:
object(UnhandledMatchError)#1 (7) {
["message":protected]=>
string(33) "Unhandled match value of type int"
["string":"Error":private]=>
string(0) ""
["code":protected]=>
int(0)
["file":protected]=>
string(9) "/in/ICgGK"
["line":protected]=>
int(6)
["trace":"Error":private]=>
array(0) {
}
["previous":"Error":private]=>
NULL
}
match
ifadelerin kullanımı
Özne ifadesi olarak true kullanarak özdeş olmayan koşullu durumları ele almak
için bir match ifadesi kullanmak mümkündür.
Örnek 5 - Tamsayı aralıklarında dallanmak için genelleştirilmiş eşleşme ifadelerinin kullanılması
<?php
$yaş = 23;
$result = match (true) {
$yaş >= 65 => 'yaşlı',
$yaş >= 25 => 'yetişkin',
$yaş >= 18 => 'genç',
default => 'çocuk',
};
var_dump($result);
?>Yukarıdaki örneğin çıktısı:
string(11) "genç"
Örnek 6 - Dize içeriklerde dallanmak için genelleştirilmiş eşleşme ifadelerinin kullanılması
<?php
$text = 'Bienvenue chez nous';
$result = match (true) {
str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
// ...
};
var_dump($result);
?>Yukarıdaki örneğin çıktısı:
string(2) "fr"