วันอังคารที่ 4 มีนาคม พ.ศ. 2568

PHP8 Union Types: ประกาศประเภทตัวแปรแบบใหม่ เพิ่มความยืดหยุ่นให้โค้ด

ถ้าใครเคยเขียน 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 ดู รับรองว่าจะช่วยให้โค้ดของคุณดีขึ้นแน่นอน! 🚀

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

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