PHP 8'in sevdiğim özelliklerinden biri match. İlk bakışta switch'in makyajlı hâli gibi görünse de aslında üç önemli fark var: katı karşılaştırma, dönüş değeri ve zorunlu kapsayıcılık.

Klasik switch'in dertleri

switch ($durum) {
    case "aktif":
        $renk = "yeşil";
        break; // break unutulursa alttaki case de çalışır!
    case "beklemede":
        $renk = "sarı";
        break;
    default:
        $renk = "gri";
}

switch gevşek karşılaştırma (==) yapar: case 0, "aktif" gibi bir dizgeyle bile eşleşebilir (PHP 7 ve öncesinde). Bu, üretimde bulması çok zor hatalara yol açar.

match ile aynı iş

$renk = match ($durum) {
    "aktif"     => "yeşil",
    "beklemede" => "sarı",
    default     => "gri",
};

Üç satırda bitti; break yok, değişkeni her dalda ayrı ayrı atama derdi yok. Üstelik match katı karşılaştırma (===) yapar ve eşleşme bulunamazsa (default da yoksa) UnhandledMatchError fırlatır - hata sessizce yutulmaz.

Karşılaştırma tablosu

Özellikswitchmatch
KarşılaştırmaGevşek (==)Katı (===)
Dönüş değeriYokVar
break gerekir mi?EvetHayır
Eşleşme yoksaSessizce geçerHata fırlatır

Birden çok değeri aynı dala bağlamak için virgül kullanın: "a", "b" => sonuc

match ne zaman uygun değil?

Her dalda birden çok satır kod çalıştırmanız gerekiyorsa match zorlamayın; okunabilirlik için klasik if/switch hâlâ yerinde olabilir. match, değer üretme senaryolarında parlar.