Switch'in üç derdi var: break unutursanız alt satıra düşer, karşılaştırma gevşektir (1 ile '1' aynı sayılır), değer döndürmez. Match üçünü de çözüyor.
Temel hali
$result = match($deger) {
durum1 => sonuc1,
durum2 => sonuc2,
durum3 => sonuc3,
default => varsayilanSonuc, // optional
};Break yok, her dal otomatik bitiyor. Karşılaştırma strict, yani tip de kontrol ediliyor. Ve bir ifade olduğu için sonucu direkt değişkene atayabiliyorsunuz.
Strict karşılaştırma farkı
$value = '1';
$result = match ($value) {
1 => 'integer 1',
'1' => 'string 1',
};
// $result = 'string 1' döner.Aynı kodu switch ile yazsaydınız 'integer 1' dönerdi, çünkü switch gevşek karşılaştırır. Hangisi doğru derseniz, genelde istediğiniz strict olandır.
Switch ile yan yana
switch ($status) {
case 'active':
$message = 'User is active';
break;
case 'inactive':
$message = 'User is inactive';
break;
default:
$message = 'Status unknown';
}
$message = match ($status) {
'active' => 'User is active',
'inactive' => 'User is inactive',
default => 'Status unknown',
};Aynı iş, yarı satır. Göz de daha rahat okuyor.
Nerede işime yarıyor
Durum kodlarını mesaja çevirmek, rol bazlı yetki belirlemek, enum ile birlikte tip güvenli dallanma yapmak. Birden fazla değeri aynı sonuca bağlayabiliyorsunuz:
$type = match($value) {
1, 2, 3 => 'Low',
4, 5, 6 => 'Medium',
7, 8, 9 => 'High',
};
$statusCode = 404;
$message = match($statusCode) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown status code',
};PHP 8.1'in enum'larıyla birlikte kullanımı da temiz:
enum UserStatus {
case Active;
case Inactive;
case Banned;
}
$status = UserStatus::Banned;
$message = match($status) {
UserStatus::Active => 'User is active',
UserStatus::Inactive => 'User is inactive',
UserStatus::Banned => 'User is banned',
};Yeni kodda switch yazmak için pek sebep kalmadı. Match daha kısa, daha güvenli, daha okunaklı.