ถ้าใครเคยเขียน PHP มาก่อน คงเคยเจอสถานการณ์ที่ต้องรับค่าหลายประเภท เช่น บางฟังก์ชันรับได้ทั้ง int และ float หรือบางตัวแปรอาจเป็น string หรือ null ได้ พอ PHP8 มา ก็เพิ่มของดีอย่าง Union Types ที่ช่วยให้เราระบุประเภทตัวแปรได้หลายแบบในคราวเดียว!
บทความนี้จะพาไปดูว่า Union Types ใน PHP8 คืออะไร? ใช้งานยังไง? แล้วมันมีประโยชน์ยังไงกับโค้ดของเรา? พร้อมตัวอย่างแบบเห็นภาพชัด ๆ ถ้าพร้อมแล้ว ไปกันเลย! 🚀
Union Types คืออะไร?
ก่อนอื่นมาทำความเข้าใจกันก่อนว่า Union Types คือการประกาศให้ตัวแปร, พารามิเตอร์ หรือค่าที่ส่งคืน (return type) มีได้หลายประเภทพร้อมกัน
🔴 PHP เวอร์ชันก่อน PHP8 ทำได้แค่ไหน?
ก่อน PHP8 ถ้าเราต้องการให้พารามิเตอร์หรือ return type รองรับหลายประเภท เรามีแค่ 2 วิธีหลัก ๆ:
1. ไม่กำหนด type เลย (แต่เสี่ยงพังง่าย!)
function getData($value) {
return $value;
}
แบบนี้แม้จะยืดหยุ่น แต่ไม่มีการตรวจสอบอะไรเลย ส่งอะไรเข้ามาก็รับหมด อาจทำให้ debug ยาก!
2. ใช้ PHPDoc เป็นคอมเมนต์ช่วยระบุ type
/**
* @param int|string $value
* @return int|string
*/
function getData($value) {
return $value;
}
แบบนี้ IDE จะรู้ว่าตัวแปรรองรับอะไรบ้าง แต่ PHP runtime เองไม่ได้เช็กจริง ๆ
Union Types ใน PHP8 ช่วยอะไรได้บ้าง?
PHP8 ให้เราสามารถประกาศ type ของพารามิเตอร์ หรือ return type ได้หลายแบบพร้อมกัน!
✅ ตัวอย่างการใช้ Union Types
function processValue(int|string $value): int|string {
return is_int($value) ? $value * 2 : "Double: " . $value;
}
echo processValue(10); // 20
echo processValue("PHP"); // Double: PHP
โค้ดข้างบนบอกว่า
- พารามิเตอร์ $value สามารถเป็น int หรือ string ก็ได้
- ค่าที่ return ออกมาก็สามารถเป็น int หรือ string ได้
แบบนี้ PHP จะช่วยตรวจสอบ type ให้เลย ไม่ต้อง rely on PHPDoc หรือคอมเมนต์อีกต่อไป! 🚀
Syntax ของ Union Types
🎯 รูปแบบการเขียน
type1|type2|type3
เช่น
function example(int|float|string|null $data) {
// โค้ดตรงนี้สามารถรับค่าทุก type ที่กำหนด
}
✅ Union Types ใช้ได้ที่ไหนบ้าง?
✔ พารามิเตอร์ (Function Parameters)
✔ ค่าที่ return (Return Type)
✔ Property ใน Class
ตัวอย่างการใช้งานจริง
1. Union Types ในฟังก์ชัน
function addNumbers(int|float $a, int|float $b): int|float {
return $a + $b;
}
echo addNumbers(10, 5.5); // 15.5
ตรงนี้ addNumbers() สามารถรับ int หรือ float ได้เลย
2. Union Types ในคลาส
class Product {
public int|float $price;
public function __construct(int|float $price) {
$this->price = $price;
}
}
$product1 = new Product(100);
$product2 = new Product(99.99);
การใช้ Union Types ใน property ทำให้มั่นใจว่า $price จะเป็น int หรือ float เท่านั้น!
3. Union Types กับ null (แทน ?)
ก่อน PHP8 ถ้าเราต้องการให้ค่ารับ null ได้ เราใช้ ? นำหน้า type เช่น
function getUserName(?string $name) {
return $name ?? "Guest";
}
แต่ตอนนี้เราสามารถใช้ Union Types แทนได้เลย
function getUserName(string|null $name) {
return $name ?? "Guest";
}
แบบนี้ช่วยให้ type system ของ PHP สม่ำเสมอขึ้น
ข้อดีของ Union Types
✅ โค้ดอ่านง่ายขึ้น – ไม่ต้องใช้ PHPDoc หรือคอมเมนต์ช่วยอีกต่อไป
✅ PHP ตรวจสอบให้เลย – ป้องกันบั๊กจากการใช้ type ผิด
✅ เพิ่มความยืดหยุ่น – ไม่ต้องเขียนฟังก์ชันซ้ำ ๆ แค่เพื่อรองรับ type ต่างกัน
✅ ทำงานกับ OOP ได้ดีขึ้น – สามารถใช้ Union Types ใน properties ได้
ข้อจำกัดของ Union Types
❌ ไม่รองรับ mixed type – ถ้าต้องการรองรับทุก type ต้องใช้ mixed แทน
❌ ไม่รองรับ void กับ type อื่น ๆ – เช่น int|void ใช้ไม่ได้
❌ ไม่สามารถใช้กับ callable หรือ array แบบซับซ้อน เช่น array|string[]
Union Types vs mixed ต่างกันยังไง?
🔹 Union Types – กำหนดประเภทที่แน่นอน เช่น int|string|float
🔹 mixed – รองรับทุกประเภท (int|string|float|bool|array|object|callable|null)
ถ้าโค้ดต้องการรองรับหลาย type แต่ยังคุมได้ ใช้ Union Types
ถ้าต้องการรับอะไรก็ได้โดยไม่สน type ใช้ mixed
ตัวอย่าง
function test(mixed $value) {
return $value;
}
แบบนี้รับอะไรก็ได้ แต่ PHP ไม่สามารถช่วยตรวจสอบ type ได้เลย
Union Types คุ้มค่าหรือไม่? ควรใช้ไหม?
✅ ใช้เลยถ้าฟังก์ชันของคุณต้องรองรับหลาย type
✅ ใช้ในคลาสเพื่อกำหนด property ให้ยืดหยุ่นขึ้น
✅ ลดการใช้ PHPDoc เพราะ PHP ตรวจสอบให้เอง
❌ ไม่ต้องใช้ถ้าแค่รองรับทุกอย่าง ใช้ mixed แทน
สรุปง่าย ๆ Union Types เป็นฟีเจอร์ที่ช่วยให้โค้ด PHP สะอาดขึ้น เช็ก type ได้ชัดเจนขึ้น และยืดหยุ่นขึ้นในเวลาเดียวกัน
สรุป:
- Union Types คือการกำหนด type หลายแบบให้พารามิเตอร์, return type และ properties
- ช่วยให้โค้ดอ่านง่ายขึ้น และป้องกัน type error ได้ดีขึ้น
- เป็นทางเลือกที่ดีกว่า PHPDoc และช่วยให้ PHP ตรวจสอบ type ได้จริง
- ข้อจำกัดบางอย่าง เช่น ไม่รองรับ void กับ type อื่น หรือ callable|array
- เป็นฟีเจอร์ที่ควรใช้ ถ้าคุณต้องการเพิ่มความยืดหยุ่นให้โค้ด
ถ้าคุณใช้ PHP8 แล้ว ลองใช้ Union Types ดู รับรองว่าจะช่วยให้โค้ดของคุณดีขึ้นแน่นอน! 🚀
ไม่มีความคิดเห็น:
แสดงความคิดเห็น