0Pricing
PHP Academy · บทเรียน

คำสั่ง Switch และ Match

ใช้ switch และ match ของ PHP 8 สำหรับตรรกะหลายแขนง

คำสั่ง Switch และ Match เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

switch เทียบกับสายโซ่ if

เมื่อมีหลายแขนงที่อิงตามค่าของตัวแปรเดียว switch จะอ่านง่ายกว่าสายโซ่ if/elseif ที่ยาว

PHP 8 เพิ่ม match เป็นทางเลือกสมัยใหม่แบบเคร่งครัด

พื้นฐานคำสั่ง switch

Switch จะประเมินนิพจน์เพียงครั้งเดียว แล้วทำงานในบล็อก case ที่ตรงกัน:

<?php
$day = 'Monday';

switch ($day) {
    case 'Monday':
        echo 'Start of work week';
        break;
    case 'Friday':
        echo 'Almost weekend';
        break;
    default:
        echo 'Midweek';
}

พฤติกรรมการไหลต่อของ switch

หากไม่มี break การทำงานจะไหลต่อไปยัง case ถัดไป ซึ่งเป็นเทคนิคสำหรับจัดกลุ่มกรณีต่าง ๆ โดยตั้งใจ:

<?php
$status = 2;

switch ($status) {
    case 1:
    case 2:
    case 3:
        echo 'In progress';  // runs for 1, 2, or 3
        break;
    case 4:
        echo 'Done';
        break;
}

Switch ใช้การเปรียบเทียบแบบไม่เคร่งครัด

Switch ใช้ == (การเปรียบเทียบแบบไม่เคร่งครัด) ภายใน ซึ่งอาจทำให้จับคู่ได้อย่างน่าประหลาดใจ:

<?php
$val = 0;

switch ($val) {
    case 'foo':   // 0 == 'foo' in PHP 7!
        echo 'match foo';
        break;
    case 0:
        echo 'match zero';  // PHP 8 fixes this
        break;
}
// PHP 8: match zero (fixed)
// PHP 7: match foo (bug!)

นิพจน์ match ใน PHP 8

match คล้าย switch แต่ใช้การเปรียบเทียบแบบเคร่งครัด คืนค่า และไม่ต้องใช้ break:

<?php
$status = 'active';

$label = match($status) {
    'active'   => 'Currently active',
    'inactive' => 'Not active',
    'pending'  => 'Awaiting activation',
    default    => 'Unknown status',
};

echo $label; // Currently active

match เมื่อไม่มีแขนงใดตรงกัน

หากไม่มีแขนงใดตรงกับ match และไม่มี default ระบบจะโยน UnhandledMatchError:

<?php
$code = 99;

try {
    $result = match($code) {
        200 => 'OK',
        404 => 'Not Found',
        500 => 'Server Error',
        // no default!
    };
} catch (\UnhandledMatchError $e) {
    echo 'Unhandled match value: ' . $code;
}

match ที่มีหลายเงื่อนไข

แขนง match หนึ่งแขนงสามารถระบุค่าหลายค่าโดยคั่นด้วยจุลภาคได้:

<?php
$lang = 'tr';

$region = match($lang) {
    'en', 'en-US', 'en-GB' => 'English',
    'tr', 'az'             => 'Turkic',
    'fr', 'be', 'ca'       => 'French-speaking',
    default                => 'Other',
};

echo $region; // Turkic

match ที่มีนิพจน์ซับซ้อน

แขนงของ match สามารถใช้นิพจน์ใด ๆ ทางด้านขวามือได้:

<?php
$score = 85;

$grade = match(true) {
    $score >= 90 => 'A',
    $score >= 80 => 'B',  // matches
    $score >= 70 => 'C',
    default      => 'F',
};

echo $grade; // B

การคืนค่าจาก match

เนื่องจาก match เป็นนิพจน์ จึงสามารถใช้ได้ทุกที่ที่ต้องการค่า:

<?php
function getHttpMessage(int $code): string {
    return match($code) {
        200 => 'OK',
        201 => 'Created',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        404 => 'Not Found',
        default => 'Unknown',
    };
}

echo getHttpMessage(404); // Not Found

switch ในบริบทการคืนค่า

สามารถใช้ switch ภายในฟังก์ชันเพื่อคืนค่าที่แตกต่างกันได้ แต่ match เขียนได้กระชับกว่า:

<?php
function describe(int $n): string {
    switch (true) {
        case $n < 0:  return 'negative';
        case $n === 0: return 'zero';
        default:       return 'positive';
    }
}

echo describe(-5);  // negative
echo describe(0);   // zero
echo describe(7);   // positive

ควรใช้ switch หรือ match เมื่อใด

แนวทางในการเลือกใช้:

  • ใช้ match เมื่อต้องการการเปรียบเทียบแบบเคร่งครัดและค่าที่ส่งคืน (PHP 8 ขึ้นไป)
  • ใช้ switch สำหรับการจัดกลุ่มแบบไหลต่อ หรือเมื่อต้องรองรับ PHP 7
  • ทั้งสองแบบอ่านง่ายกว่าสายโซ่ if/elseif ที่ยาวเมื่อมีการแบ่งแขนงตามหลายค่า

ตรวจสอบความเข้าใจ

จะเกิดอะไรขึ้นในนิพจน์ match เมื่อไม่มีแขนงใดตรงกันและไม่มี default

สรุป: switch และ match

ความแตกต่างสำคัญ:

  • switch — การเปรียบเทียบแบบไม่เคร่งครัด การไหลต่อ และรองรับตั้งแต่ PHP 4 ขึ้นไป
  • match — การเปรียบเทียบแบบเคร่งครัด ไม่มีการไหลต่อ คืนค่า และรองรับตั้งแต่ PHP 8 ขึ้นไป
  • match จะโยน UnhandledMatchError เมื่อไม่มี default
  • แขนงของ match รับค่าหลายค่าโดยคั่นด้วยจุลภาคได้

ถัดไป: ลูป for และ while

คำถามที่พบบ่อย

บทเรียน “คำสั่ง Switch และ Match” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คำสั่ง Switch และ Match” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คำสั่ง Switch และ Match”

ใช้ switch และ match ของ PHP 8 สำหรับตรรกะหลายแขนง คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “คำสั่ง Switch และ Match” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. if, elseif และ else
  2. คำสั่ง Switch และ Match
  3. ลูป for และ while
  4. foreach และการควบคุมลูป
← กลับไปที่ PHP Academy