switch va match — qachon qaysi biri

~12 daq · PHP · Boshqaruv tuzilmalari

Muammodan boshlaylik

Buyurtma holati bazada qisqa kod sifatida saqlanadi: new, paid, shipped, delivered, cancelled. Sahifada esa o'zbekcha ko'rsatish kerak. if/elseif bilan yozsak:

<?php

if ($holat === 'new') {
    $matn = "Yangi";
} elseif ($holat === 'paid') {
    $matn = "To'langan";
} elseif ($holat === 'shipped') {
    $matn = "Yo'lda";
} elseif ($holat === 'delivered') {
    $matn = "Yetkazildi";
} else {
    $matn = "Noma'lum";
}

Ishlaydi, lekin $holat === 4 marta takrorlanadi. Bitta o'zgaruvchini ko'p qiymatga solishtirish uchun maxsus tuzilmalar bor.


match — zamonaviy usul (PHP 8+)

<?php

$holat = 'paid';

$matn = match ($holat) {
    'new'       => "Yangi",
    'paid'      => "To'langan",
    'shipped'   => "Yo'lda",
    'delivered' => "Yetkazildi",
    default     => "Noma'lum",
};

echo $matn;   // To'langan

Tuzilishi:

  • match (qiymat) — nima tekshirilyapti
  • variant => natija, — har bir moslik
  • default — hech biri to'g'ri kelmasa
  • match qiymat qaytaradi — natijani o'zgaruvchiga saqlash mumkin
  • Oxirida ; bor — chunki bu ifoda

Bir nechta variant — bitta natija

<?php

$kun = 'shanba';

$turi = match ($kun) {
    'shanba', 'yakshanba' => "Dam olish kuni",
    default               => "Ish kuni",
};

match qat'iy solishtiradi

match === ishlatadi — tur ham mos bo'lishi kerak:

<?php

$kod = "1";

echo match ($kod) {
    1       => "Bir (son)",
    "1"     => "Bir (matn)",
    default => "Boshqa",
};
// Bir (matn)

default bo'lmasa — xato

<?php

$holat = 'xato_holat';

echo match ($holat) {
    'new'  => "Yangi",
    'paid' => "To'langan",
};
// UnhandledMatchError: Unhandled match case 'xato_holat'

Bu yaxshi narsa: kutilmagan qiymat jimgina o'tib ketmaydi, darhol ko'rinadi.

Diapazonlar uchun: match (true)

<?php

$ball = 82;

$baho = match (true) {
    $ball >= 90 => "A'lo",
    $ball >= 70 => "Yaxshi",
    $ball >= 50 => "Qoniqarli",
    default     => "Qoniqarsiz",
};

echo $baho;   // Yaxshi

match (true) — "qaysi shart true ga teng?" degani. Bu if/elseif zanjirining qisqa va chiroyli ko'rinishi.


switch — klassik usul

match dan oldin switch ishlatilgan. Eski kodda juda ko'p uchraydi, shuning uchun bilish shart:

<?php

$holat = 'paid';

switch ($holat) {
    case 'new':
        $matn = "Yangi";
        break;
    case 'paid':
        $matn = "To'langan";
        break;
    case 'shipped':
        $matn = "Yo'lda";
        break;
    default:
        $matn = "Noma'lum";
}

echo $matn;   // To'langan

break nima uchun kerak?

break — "switch dan chiq" degani. Uni unutsangiz, PHP keyingi case larni ham bajaradi:

<?php

$holat = 'new';

switch ($holat) {
    case 'new':
        echo "Yangi ";
    case 'paid':
        echo "To'langan ";
    case 'shipped':
        echo "Yo'lda ";
}
// Yangi To'langan Yo'lda  ← hammasi chiqdi!

Bu "fall-through" deyiladi. Ba'zan ataylab ishlatiladi (bir nechta case — bitta kod), lekin ko'pincha bu xato.


match va switch farqi

match switch
Solishtirish === (qat'iy) == (yumshoq)
Qiymat qaytaradimi ✅ Ha ❌ Yo'q
break kerakmi Yo'q Ha, unutsangiz — xato
Mos kelmasa UnhandledMatchError Jimgina hech narsa qilmaydi
Har bir variantda Bitta ifoda Ko'p qatorli kod
PHP versiyasi 8.0+ Har doim bor

Qoida:

  • Qiymatga qarab boshqa qiymat tanlash kerak bo'lsa → match
  • Har bir variantda bir nechta amal bajarish kerak bo'lsa → switch yoki if

Nima uchun shunday?

Nima uchun PHP ga switch turib, yana match qo'shildi?

switch C tilidan meros qolgan va uning uchta muammosi bor edi: == ning kutilmagan natijalari (switch ("abc") ichida case 0: PHP 7 da mos kelardi), unutilgan break lar va qiymat qaytara olmaslik. Bu muammolarni orqaga moslikni buzmasdan tuzatib bo'lmasdi — shuning uchun yangi, xavfsiz tuzilma qo'shildi.


Tez-tez uchraydigan xatolar

match oxirida ; ni unutish:

<?php

$x = match ($a) {
    1 => 'bir',
    default => 'boshqa',
}    // ❌ Parse error — ; kerak

match ichida bir nechta qator yozishga urinish:

<?php

match ($holat) {
    'new' => {
        echo "a";
        echo "b";
    },   // ❌ Parse error — match faqat bitta ifoda qabul qiladi
};

Bunday holatda funksiya chaqiring yoki switch ishlating.

switch da break ni unutish — yuqorida ko'rdik.


Xulosa

Eslab qoling:

  • match — qat'iy (===), qiymat qaytaradi, break kerak emas
  • match (true) — diapazon va murakkab shartlar uchun
  • default siz match kutilmagan qiymatda xato beradi — bu foydali
  • switch — eski kodda ko'p; har bir case dan keyin break
  • Yangi kodda odatda match ni tanlang

Keyingi dars

10-dars: Sikllar — for, while, do-while, break, continue