PHP / switch хуваарилагч

switch хуваарилагч

Нэг хувьсагчийн олон боломжит утгыг шалгах шаардлага байнга гардаг. if / elseif / else-ийг дараалан нь бичиж болно, гэхдээ тохиолдол олон болохоор код нь уншиход хэцүү болдог. Яг энэ тохиолдолд switch хуваарилагч тохиромжтой — кодыг цэвэр, тодорхой болгодог.

switch үндсэн бүтэц

php
<?php
$гараг = "Мягмар";

switch ($гараг) {
    case "Даваа":
        echo "7 хоногийн эхний өдөр.";
        break;
    case "Мягмар":
        echo "7 хоногийн хоёрдугаар өдөр.";
        break;
    case "Лхагва":
        echo "Долоо хоногийн дунд.";
        break;
    case "Пүрэв":
        echo "Баасан ойрхон болж байна!";
        break;
    case "Баасан":
        echo "Амрах өдөр ойрхон!";
        break;
    default:
        echo "Амралтын өдөр — сайхан амар!";
}
// 7 хоногийн хоёрдугаар өдөр.
?>

switch нь утгуудыг == (loose comparison) -ээр харьцуулдаг. Тохирсон case олдвол тэр блок гүйцэтгэгдэж, break-д хүртэл үргэлжилдэг.

break яагаад чухал вэ?

break -ийг орхивол PHP дараагийн case-ийг мөн гүйцэтгэнэ — энийг fall-through гэж нэрлэдэг:

php
<?php
$оноо = 2;

switch ($оноо) {
    case 1:
        echo "Нэгдүгээр байр — Алт!";
        break;
    case 2:
        echo "Хоёрдугаар байр — Мөнгө!";
        // break байхгүй — дараагийн case рүү унана!
    case 3:
        echo "Гуравдугаар байр — Хүрэл!";
        break;
    default:
        echo "Оролцогч.";
}
// Хоёрдугаар байр — Мөнгө!
// Гуравдугаар байр — Хүрэл!   ← гэнэтийн!
?>

Энэ зан чанарыг санаатайгаар ашиглаж болно — олон case нэг кодоор боловсруулах үед:

php
<?php
$сар = 4;   // Дөрөвдүгээр сар

switch ($сар) {
    case 12:
    case 1:
    case 2:
        echo "Өвөл";
        break;
    case 3:
    case 4:
    case 5:
        echo "Хавар";
        break;
    case 6:
    case 7:
    case 8:
        echo "Зун";
        break;
    default:
        echo "Намар";
}
// Хавар
?>

return ашиглах функц дотор

Функц дотор switch ашиглахдаа break-ийн оронд return хэрэглэж болно — код богиносно:

php
<?php
function гарагийн_нэр(int $дугаар): string {
    switch ($дугаар) {
        case 1: return "Даваа";
        case 2: return "Мягмар";
        case 3: return "Лхагва";
        case 4: return "Пүрэв";
        case 5: return "Баасан";
        case 6: return "Бямба";
        case 7: return "Ням";
        default: return "Тодорхойгүй";
    }
}

echo гарагийн_нэр(3);   // Лхагва
echo гарагийн_нэр(9);   // Тодорхойгүй

// Өнөөдрийн гаараг
$өнөөдөр = (int) date("N");   // 1=Да, 7=Ня
echo гарагийн_нэр($өнөөдөр);
?>

switch vs match — харьцуулалт

PHP 8-д нэмэгдсэн match нь switch-ийн орчин үеийн хувилбар. Ялгааг нь мэдэх нь чухал:

php
<?php
$статус = "идэвхтэй";

// switch — loose comparison (==), утга буцаадаггүй
switch ($статус) {
    case "идэвхтэй":
        $өнгө = "ногоон";
        break;
    case "хаалттай":
        $өнгө = "улаан";
        break;
    default:
        $өнгө = "саарал";
}
echo $өнгө;   // ногоон

// match — strict comparison (===), утга буцаадаг, богино
$өнгө = match($статус) {
    "идэвхтэй"   => "ногоон",
    "хаалттай"   => "улаан",
    "хүлээгдэж байгаа" => "шар",
    default      => "саарал",
};
echo $өнгө;   // ногоон
?>

match нь:

  • Strict comparison (===) ашиглана — "1" ба 1 ялгана
  • Утга шууд буцаана — $хувьсагч = match(...) { ... };
  • break хэрэггүй
  • Тохирох case олдохгүй бол UnhandledMatchError алдаа шиддэг

Практик жишээ — HTTP статус код

php
<?php
function статус_тайлбар(int $код): string {
    switch ($код) {
        case 200:
            return "OK — Хүсэлт амжилттай.";
        case 201:
            return "Created — Амжилттай үүсгэсэн.";
        case 400:
            return "Bad Request — Хүсэлт буруу.";
        case 401:
            return "Unauthorized — Нэвтрэх шаардлагатай.";
        case 403:
            return "Forbidden — Хандах эрхгүй.";
        case 404:
            return "Not Found — Олдсонгүй.";
        case 500:
            return "Internal Server Error — Серверийн алдаа.";
        default:
            return "Тодорхойгүй статус код: $код";
    }
}

echo статус_тайлбар(200);   // OK — Хүсэлт амжилттай.
echo статус_тайлбар(404);   // Not Found — Олдсонгүй.
echo статус_тайлбар(418);   // Тодорхойгүй статус код: 418
?>

Дараагийн хичээлд:

Давталтуудыг — for, while, do-while, foreach — судална. Тэдгээр нь хэрхэн ажилладаг, ямар нөхцөлд аль давталтыг сонгох, break ба continue хэрхэн хэрэглэгддэгийг үзнэ.