ป้ายกำกับ: Strict Comparison

PHP Match Expression: มาแทน Switch CasePHP Match Expression: มาแทน Switch Case

ถ้าคุณเป็นนักพัฒนา PHP ที่คุ้นเคยกับ switch-case มานาน วันนี้เรามีเครื่องมือที่ดีกว่า สั้นกว่า และปลอดภัยกว่ามาแนะนำ นั่นคือ Match Expression ครับ ฟีเจอร์นี้ถูกเพิ่มเข้ามาใน PHP 8.0 เพื่อช่วยให้การตรวจสอบเงื่อนไขและคืนค่า (Return Value) ทำได้คลีนขึ้นมาก


💡 Match Expression คืออะไร?

match เป็นโครงสร้างควบคุมเงื่อนไขที่คล้ายกับ switch แต่ทำงานในลักษณะของ Expression (หมายความว่ามันสามารถคืนค่าออกมาใส่ในตัวแปรได้โดยตรง) และใช้การเปรียบเทียบค่าแบบ Strict Comparison (===) ซึ่งปลอดภัยกว่า switch ที่ใช้แบบ ==


⚔️ เปรียบเทียบช็อตต่อช็อต: Switch vs Match

เพื่อให้เห็นภาพชัดเจน ลองมาดูโจทย์เดียวกัน: ต้องการแปลงรหัสสถานะ HTTP เป็นข้อความ


แบบเดิม: Switch Case

switch ($statusCode) {
    case 200:
        $message = 'OK';
        break;
    case 404:
        $message = 'Not Found';
        break;
    case 500:
        $message = 'Internal Server Error';
        break;
    default:
        $message = 'Unknown Status';
        break;
}

ปัญหาของ Switch: เขียนยาว, ต้องใส่ break; ทุกครั้ง (ถ้าลืม บั๊กทันที), และต้องคอยกำหนดค่าให้ตัวแปร $message ซ้ำ ๆ


แบบใหม่: Match Expression

$message = match ($statusCode) {
    200 => 'OK',
    404 => 'Not Found',
    500 => 'Internal Server Error',
    default => 'Unknown Status',
};

สิ่งที่ดียิ่งกว่า: สั้นกระชับ, ส่งค่ากลับไปที่ $message ได้ทันที, และไม่ต้องกลัวเรื่องลืมใส่ break


🚀 3 ฟีเจอร์เด่นของ Match Expression ที่คุณต้องรู้

1. การเปรียบเทียบแบบแม่นยำ (Strict Comparison)

switch จะมองว่า 0 เท่ากับ '0' หรือ false แต่ match จะเช็กประเภทข้อมูลด้วย (เหมือนการใช้ ===)

$value = '200';

$result = match ($value) {
    200 => 'This is integer',
    '200' => 'This is string', // จะตกที่เคสนี้อย่างถูกต้อง
};

2. ยุบรวมหลายเงื่อนไขได้ง่ายๆ ด้วยเครื่องหมายจุลภาค (Comma)

ถ้ามีหลายเงื่อนไขที่ต้องการให้ผลลัพธ์เหมือนกัน ไม่ต้องเขียนบรรทัดใหม่ซ้ำ ๆ แค่ใช้ , คั่นได้เลย

$role = 'editor';

$access = match ($role) {
    'admin', 'editor', 'author' => 'Allowed to publish',
    'subscriber' => 'Read only',
    default => 'Denied',
};

3. ต้องมี Default เสมอ (ไม่งั้น Error!)

ถ้าค่าที่ส่งเข้าไปไม่ตรงกับเคสใดเลย และคุณไม่ได้เขียน default ไว้ PHP จะพ่น UnhandledMatchError ออกมาทันที ซึ่งถือเป็นข้อดี เพราะช่วยลดโอกาสเกิดบั๊กลึกลับในระบบ


📝 สรุป: ควรใช้ตอนไหน?

  • ใช้ Match เมื่อ: ต้องการตรวจสอบค่าเดี่ยว ๆ แล้วคืนค่า (Return) ผลลัพธ์กลับมาทันที หรือเมื่อต้องการความแม่นยำของประเภทข้อมูล (Strict Checking)
  • ใช้ Switch เมื่อ: ต้องการทำ Logic ที่ซับซ้อนภายในแต่ละ Case (มีโค้ดหลายบรรทัดในเคส นั้น ๆ) หรือไม่จำเป็นต้องคืนค่าใด ๆ

ลองหยิบ match ไปปรับใช้ในโปรเจกต์ดูครับ แล้วจะพบว่าโค้ดของคุณอ่านง่ายและปลอดภัยขึ้นอีกเยอะ!


อ่านเพิ่มเติม