เวลาเราเขียนฟังก์ชันใน PHP ยุคก่อน สิ่งหนึ่งที่น่าปวดหัวคือ “ลำดับของ Parameter” ยิ่งฟังก์ชันไหนมีตัวแปรให้ส่งเยอะ ๆ หรือมี Optional Parameter (ค่าเริ่มต้น) หลายตัว โค้ดของเราจะเริ่มดูรกและเข้าใจยากทันที
แต่ตั้งแต่ PHP 8.0 เป็นต้นมา ปัญหานี้จะหมดไปด้วยฟีเจอร์ Named Arguments ที่ช่วยให้เราสามารถส่งค่าเข้าฟังก์ชันโดยระบุชื่อ Parameter ได้โดยตรง ไม่ต้องสนลำดับอีกต่อไป!
💡 Named Arguments คืออะไร?
จากเดิมที่เราต้องส่งค่าตามลำดับ (Positional Arguments) เช่น ตึก, ชั้น, ห้อง พอเป็น Named Arguments เราจะส่งสลับกันอย่างไรก็ได้ ขอแค่ระบุชื่อให้ถูก เช่น ห้อง: 101, ตึก: A, ชั้น: 3
เปรียบเทียบให้เห็นภาพ
สมมติเรามีฟังก์ชันสำหรับตั้งค่า Cookie
function setCustomCookie(string $name, string $value, int $expire = 0, string $path = "", string $domain = "", bool $secure = false) {
// ... logic ...
}
❌ แบบเดิม (Positional): ถ้าเราต้องการเปลี่ยนแค่ค่า $secure เป็น true แต่เหลือส่วนอื่นเป็นค่า Default เราต้องส่งไปแบบนี้…
setCustomCookie("user_session", "xyz123", 0, "", "", true);
ปัญหาก็คือ: ไอเลข 0 กับ "" ยาว ๆ นั้่นคืออะไรบ้างนะ? คนมาอ่านต่อ (หรือแม้แต่ตัวเราเองในอีก 3 เดือนข้างหน้า) ต้องเปิดดูฟังก์ชันต้นทางกันวุ่นวาย
✔️ แบบใหม่ (Named Arguments): ระบุชื่อไปเลย! ตัวไหนใช้ค่า Default ก็ไม่ต้องส่ง
setCustomCookie(
name: "user_session",
value: "xyz123",
secure: true
);
โค้ดสั้นลงอย่างเห็นได้ชัด อ่านปุ๊บรู้ปั๊บว่าเรากำลังตั้งค่า secure: true โดยไม่ต้องใส่ 0 หรือ "" มาคั่นให้รำคาญตา
🚀 ข้อดีที่คุณจะได้รับ
- โค้ดอ่านง่ายขึ้นมาก (Self-Documenting Code)
การใส่ชื่อ Parameter กำกับไว้ ทำให้โค้ดอธิบายตัวเองได้ โดยไม่ต้องพึ่ง Comment คอมพิวเตอร์เข้าใจ คนในทีมก็แฮปปี้ - ข้าม Optional Parameters ได้ตามใจชอบ
ไม่ต้องทนส่งค่า Default ซ้ำ ๆ อีกต่อไป อยากเปลี่ยนค่าของ Parameter ตัวไหน ก็เจาะจงส่งไปแค่ตัวนั้นได้เลย - ลำดับไม่ใช่เรื่องสำคัญอีกต่อไป
คุณสามารถส่ง Parameter ตัวท้ายสุดขึ้นมาก่อนก็ได้ ไม่มีผลต่อการทำงาน
// สลับที่กันก็ไม่มีปัญหา ทำงานได้ถูกต้องเหมือนกัน
setCustomCookie(secure: true, value: "xyz123", name: "user_session");
⚠️ ข้อควรระวัง และ Best Practices
แม้ฟีเจอร์นี้จะสะดวกมาก แต่ก็มีเรื่องที่ต้องระวังอยู่บ้างครับ
- การใช้ผสมกัน (Combined Arguments): คุณสามารถใช้ผสมกันระหว่างแบบเดิม (Positional) และแบบระบุชื่อ (Named) ได้ แต่มีเงื่อนไขว่า แบบ Positional ต้องมาก่อน Named เสมอ
// ✅ ทำได้ setCustomCookie("user_session", "xyz123", secure: true); // ❌ พัง! (Fatal Error) เอา Named ขึ้นก่อน Positional ไม่ได้ setCustomCookie(name: "user_session", "xyz123", secure: true); - ชื่อแปรเปลี่ยน โค้ดเปลี่ยน: ถ้าในอนาคตคุณไปเปลี่ยนชื่อ Parameter ในฟังก์ชันหลัก โค้ดทุกจุดที่เรียกใช้ผ่าน Named Arguments จะพังทันที ดังนั้นหากจะทำการ Refactor ชื่อตัวแปร ต้องตรวจสอบโค้ดที่เรียกใช้งานให้ดีด้วยครับ
🎯 สรุป
Named Arguments ใน PHP เป็นฟีเจอร์ที่ช่วยเพิ่ม Readability (ความอ่านง่าย) และ Flexibility (ความยืดหยุ่น) ในการเขียนโค้ดได้อย่างมหาศาล เหมาะมากกับฟังก์ชันที่มี Parameter เยอะๆ หรือพวก Configuration ต่างๆ ครับ
อ่านเพิ่มเติม