ในการเขียนโปรแกรมภาษา PHP เวอร์ชันแรก ๆ เรามักคุ้นเคยกับความเป็น Dynamically Typed Language หรือภาษาที่ไม่ได้บังคับให้ระบุประเภทข้อมูลของตัวแปรอย่างเข้มงวด แต่เมื่อ PHP พัฒนาเข้าสู่ยุคโมเดิร์น (PHP 7 และ PHP 8) ระบบ Type System ได้ถูกปรับปรุงให้แข็งแกร่งขึ้นเรื่อย ๆ เพื่อลดข้อผิดพลาด (Bugs) ในการทำงาน
หนึ่งในฟีเจอร์ที่เพิ่มเข้ามาใน PHP 8.0 และมีบทบาทสำคัญมากสำหรับนักพัฒนาคือ mixed type
mixed type คืออะไร?
mixed คือ Type Hinting ที่บอกว่าตัวแปร, Parameter หรือ Return Value นั้น ๆ สามารถเป็นประเภทข้อมูลใดก็ได้ ในภาษา PHP
การใช้ mixed มีค่าเท่ากับการรวมประเภทข้อมูลทุกอย่างเข้าด้วยกัน (Union Type) ดังนี้: object|resource|array|string|int|float|bool|null
💡 ข้อควรจำ
ตั้งแต่ PHP 8.0 เป็นต้นไป mixed ได้กลายเป็น Type สแตนดาร์ดตัวหนึ่ง ไม่ใช่แค่คำอธิบายใน Docblock (/** @var mixed */) อีกต่อไป
ทำไมต้องใช้ mixed ในเมื่อไม่ใส่ Type เลยก็ได้?
ก่อน PHP 8.0 ถ้าเราไม่ใส่ Type ให้กับ Parameter ระบบจะเข้าใจโดยอัตโนมัติว่ามันเป็นอะไรก็ได้ แล้วทำไมเรายังต้องเขียนคำว่า mixed ให้เหนื่อยเพิ่มขึ้น?
นี่คือเหตุผลหลัก 3 ข้อครับ
- Explicit Intent (แสดงเจตนาที่ชัดเจน)
การใส่ mixed เป็นการบอกนักพัฒนาคนอื่น (หรือตัวเราในอนาคต) ว่า “ฉันตั้งใจให้ฟังก์ชันนี้รับค่าอะไรก็ได้จริง ๆนะ ไม่ใช่ว่าฉันลืมใส่ Type” - Better IDE Support
Tool หรือ IDE อย่าง PHPStorm หรือ VS Code จะเข้าใจบริบท และช่วยตรวจเช็กโค้ด (Static Analysis) ได้ดีขึ้น - Strict Return Type
ถ้าระบุว่าฟังก์ชันต้อง Return mixed หากเราลืม Return หรือไม่มีการส่งค่ากลับมา PHP จะแจ้ง Error ทันที (ต่างจากการไม่ใส่ Type เลย ที่จะยอมให้กลายเป็นvoidได้)
ตัวอย่างการใช้งาน mixed
ใช้กับ Function Parameter
เหมาะสำหรับฟังก์ชันส่วนกลาง (Utility Functions) ที่ต้องประมวลผลข้อมูลหลายรูปแบบ เช่น ฟังก์ชันสำหรับจัดฟอร์แมตเพื่อแสดงผล debug
PHP
PHP
function debug_log(mixed $data): void {
if (is_array($data) || is_object($data)) {
print_r($data);
} else {
echo $data . PHP_Line_Break;
}
}
debug_log("Hello World"); // ทำงานได้ (string)
debug_log(10025); // ทำงานได้ (int)
debug_log(['a', 'b']); // ทำงานได้ (array)