PHP 8 - Match Nedir, Nasıl Kullanılır?

PHP 31 Ara 2021

PHP 8 ile aramıza katılan "match" ifadesi tıpkı bir "switch-case" yapısı gibi çalışır. Genellikle match yapısını kullanmak bizim için daha güçlü olacaktır. Basitçe temel farkları ele alalım.

Klasik bir switch-case örneğiyle başlayalım:

switch ($statusCode) {
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

Şimdi de aynı kodu match yapısını kullanarak yazalım:

$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

Her şeyden önce, söz dizimi çok daha kısadır.

  • Bir "break" ile kapatılması gerekmez.
  • Virgül kullanarak yapıları tek bir kolda birleştirebilir.
  • Bir değer döndürür, bu nedenle bir değer atamanız gerekir.

Strict Type olarak çalışır

Match katıdır. İfadelerin type değerlerini ayırt eder. Ona tam olarak istediğini verseniz iyi edersiniz 😎

Yani, eklenen bir ifadeyi "==" ile değil de "===" ile kontrol etmeye benzer.

$statusCode = '200';

$message = match ($statusCode) {
    200 => null,
    default => 'unknown status code',
};

// $message = 'unknown status code'

Bilinmeyen değerler hatalara neden olur

Tanımınızda default bir değer mevcut değilse, PHP bir UnhandledMatchError istisnası atar. Daha fazla katılık! Ama iyi yönünden bakmak gerekirse, basit hataların fark edilmeden gitmesini önleyecektir.

$statusCode = 400;

$message = match ($statusCode) {
    200 => 'perfect',
};

// UnhandledMatchError

Koşulları birleştirme

Break eksikliğini farkettik. Yani ilk örneğimizde olduğu gibi geçiş koşullarına izin vermez. Ancak, koşulları virgül ile ayırarak tek satırda birleştirebilirsiniz.

Yani bu konuda switch ile aynı işlevselliğe sahipsiniz, ancak daha az yazma ve daha az hata yapma yolu ile. Win-win!

$message = match ($statusCode) {
    200, 300, 301, 302 => 'combined expressions',
};

Karmaşık koşullar ve performans

RFC tartışması sırasında bazı yazılım geliştiriciler "match" ifadesi kullanımıza karşı şu şekilde bir argüman sundular.

$message = [
    $this->matchesRegex($line) => 'match A',
    $this->matchesOtherRegex($line) => 'match B',
][$line] ?? 'no match';

Ancak buradaki handikap, tüm ifadelerin önce işlevini yerini getirerek, gereksiz bir performans kaybı yaşatmasıdır.

İstisnaları fırlatma

Bir koldan direk bir exception fırlatmak mümkündür.

$message = match ($statusCode) {
    200 => null,
    500 => throw new ServerError(),
    default => 'unknown status code',
};

Yani, Switch mi yoksa Case mi?

Özetlemek gerekirse, match ifadesi switch ifadesinin çok daha katı ve modern bir versiyonudur.

Ancak özellikle çok yapılı kod bloklarında switch size daha fazla esneklik sunacaktır. Bunun yanında match ifadesi ise bu "katı" özellikleriyle daha çekici gelecektir.

Etiketler