switch va match — qachon qaysi biri
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 tekshirilyaptivariant => natija,— har bir moslikdefault— hech biri to'g'ri kelmasamatchqiymat 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 →
switchyokiif
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,breakkerak emasmatch (true)— diapazon va murakkab shartlar uchundefaultsizmatchkutilmagan qiymatda xato beradi — bu foydaliswitch— eski kodda ko'p; har bircasedan keyinbreak- Yangi kodda odatda
matchni tanlang
Keyingi dars
10-dars: Sikllar — for, while, do-while, break, continue