แต่เดี๋ยวก่อน! 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 ดู รับรองว่าโค้ดดูแพงขึ้นแน่นอน! 🚀
ไม่มีความคิดเห็น:
แสดงความคิดเห็น