วันอาทิตย์ที่ 23 กุมภาพันธ์ พ.ศ. 2568

[PHP] Magic of Match: ใช้ Match Expression ใน PHP 8 แทน if-else แบบเดิม

ถ้าพูดถึงการเขียนเงื่อนไขใน PHP เชื่อว่าหลายคนต้องนึกถึง if-else เป็นอันดับแรก แต่พอเงื่อนไขเยอะขึ้น โค้ดก็เริ่มรก ยาวเป็นหางว่าว และอ่านยากสุดๆ

แต่เดี๋ยวก่อน! PHP 8 มาพร้อมกับพระเอกตัวใหม่ที่ชื่อว่า Match Expression ที่จะมาช่วยให้โค้ดเงื่อนไขของคุณสั้น กระชับ และดูโปรกว่าเดิมหลายเท่า

ในบทความนี้ เราจะมาทำความรู้จักกับ match ว่ามันคืออะไร ใช้ยังไง และทำไมมันถึงเป็นตัวตายตัวแทนของ if-else หรือ switch-case ได้!

🎩 Match Expression คืออะไร?

match เป็น expression ใหม่ใน PHP 8 ที่คล้าย switch แต่มีความสามารถเหนือกว่า เพราะมัน:
✅ สั้นกว่า – เขียนได้กระชับ ไม่ต้องมี break;
✅ เทียบค่าแบบ strict (===) – ไม่ต้องกลัวเรื่อง type conversion แปลกๆ
✅ คืนค่าได้เลย – ใช้ return ค่าได้โดยตรง

ลองดูตัวอย่างนี้ 👇

🆚 if-else แบบเดิม


$grade = 'B';
 
if ($grade === 'A') {
    $message = 'เยี่ยมไปเลย! 🎉';
} elseif ($grade === 'B') {
    $message = 'ดีมาก! 👍';
} elseif ($grade === 'C') {
    $message = 'พอไหว 😅';
} else {
    $message = 'ต้องพยายามอีกนิด 💪';
}
 
echo $message;

โค้ดนี้อ่านง่ายตอนเงื่อนไขน้อยๆ แต่ถ้ามีหลายระดับ ความซับซ้อนจะพุ่งปรี๊ด

✨ ใช้ match ให้สวยและแพงกว่าเดิม


$grade = 'B';

$message = match ($grade) {
    'A' => 'เยี่ยมไปเลย! 🎉',
    'B' => 'ดีมาก! 👍',
    'C' => 'พอไหว 😅',
    default => 'ต้องพยายามอีกนิด 💪',
};

echo $message;


เห็นไหม? match ทำให้โค้ดสั้นลง อ่านง่ายขึ้น ไม่ต้องพึ่ง break; หรือ return หลายบรรทัด


🔥 ข้อดีของ Match ที่เหนือกว่า If-Else และ Switch

1. Strict Comparison (===) ในตัว

match ใช้การเปรียบเทียบแบบ strict (===) ต่างจาก switch ที่ใช้ loose comparison (==)
 

🛑 switch มีปัญหาอะไร?

$value = '1';

switch ($value) {
    case 1:
        echo 'Yes';
        break;
    default:
        echo 'No';
}

💥 อันนี้จะแสดง Yes เพราะ switch เปรียบเทียบแบบ loose (==) ทำให้ '1' เท่ากับ 1


✅ match แก้ปัญหานี้ได้


$value = '1';

echo match ($value) {
    1 => 'Yes',
    default => 'No',
};


✨ อันนี้จะออก No เพราะ match ใช้ === ทำให้ '1' กับ 1 ไม่เท่ากัน

2. คืนค่าได้ทันที (Expression-based)

match สามารถ return ค่าออกมาได้เลย ไม่ต้องสร้างตัวแปรก่อน เช่น

function getDiscount($membership) {
    return match ($membership) {
        'gold' => 20,
        'silver' => 10,
        'bronze' => 5,
        default => 0,
    };
}

echo getDiscount('gold'); // 20


แต่ถ้าเป็น switch หรือ if-else ต้องทำแบบนี้:


function getDiscount($membership) {
    switch ($membership) {
        case 'gold':
            return 20;
        case 'silver':
            return 10;
        case 'bronze':
            return 5;
        default:
            return 0;
    }
}

👆 เยอะกว่ากันเห็นๆ


3. ใช้หลายเงื่อนไขในบรรทัดเดียว

อยากให้หลายๆ ค่ามีผลลัพธ์เหมือนกัน? ทำได้ง่ายๆ

$category = 'mango';

$type = match ($category) {
    'apple', 'mango', 'banana' => 'fruit',
    'carrot', 'spinach' => 'vegetable',
    default => 'unknown',
};

echo $type; // fruit

💡 match รองรับการแมปหลายค่าให้เป็นค่าเดียว

4. ไม่มีปัญหา "ตกเคส" แบบ Switch

switch ถ้าเราลืมใส่ break; อาจเกิดปัญหาการตกเคส เช่น

$color = 'red';

switch ($color) {
    case 'red':
        echo 'Stop!';
    case 'yellow':
        echo 'Slow down!';
    case 'green':
        echo 'Go!';
}

💥 อันนี้จะแสดง Stop!Slow down!Go! เพราะ switch ไม่ได้หยุดที่ case red

แต่ match ไม่มีปัญหานี้ เพราะมันไม่ทำงานแบบ fallthrough

$color = 'red';

echo match ($color) {
    'red' => 'Stop!',
    'yellow' => 'Slow down!',
    'green' => 'Go!',
};

✅ แสดงแค่ Stop! ถูกต้องเป๊ะ!


🤔 เมื่อไหร่ควรใช้ Match?

    ✅ เมื่อมีการแมปค่าตรงๆ (mapping values)
    ✅ เมื่ออยากให้โค้ดสั้น กระชับ อ่านง่าย
    ✅ เมื่ออยากได้ strict comparison (===)

แต่! match ไม่สามารถใช้เงื่อนไขซับซ้อนแบบ if-else ได้ เช่น

$age = 20;

$category = match (true) { // ❌ ไม่เวิร์คแบบนี้
    $age < 18 => 'เด็ก',
    $age >= 18 && $age < 60 => 'ผู้ใหญ่',
    default => 'ผู้สูงอายุ',
};

💥 แบบนี้ match จะ error เพราะมันไม่ได้ออกแบบมาให้ใช้เงื่อนไขที่ซับซ้อนแบบนี้



🎯 สรุป: Match ดีกว่า If-Else และ Switch ยังไง?

✅ โค้ดสั้น กระชับ อ่านง่าย
✅ ใช้ === ป้องกันปัญหาประเภทข้อมูล
✅ คืนค่าได้เลย (expression-based)
✅ ไม่มีปัญหาตกเคสแบบ switch
✅ รองรับหลายค่าในเงื่อนไขเดียว

แต่ก็มีข้อจำกัดตรงที่ไม่รองรับเงื่อนไขที่ซับซ้อนเกินไป

ใครที่ยังใช้ if-else หรือ switch กันอยู่ ลองปรับมาใช้ match ดู รับรองว่าโค้ดดูแพงขึ้นแน่นอน! 🚀

ไม่มีความคิดเห็น:

แสดงความคิดเห็น