เคยไหมที่คุณต้องเขียนโค้ดเช็คค่า isset() ซ้ำๆ เพื่อตรวจสอบว่าตัวแปรมีค่าอยู่จริงหรือเปล่า หรือต้องคอยกำหนดค่าเริ่มต้น (Default Value) ให้กับตัวแปรเพื่อให้โปรแกรมไม่พัง?
ใน PHP 7 ได้มีการนำฟีเจอร์หนึ่งเข้ามา ซึ่งช่วยให้ชีวิตของ Developer ง่ายขึ้นมาก นั่นคือ Null Coalescing Operator (??) เครื่องมือที่จะเปลี่ยนโค้ดเงื่อนไขยุ่งเหยิงให้เหลือเพียงบรรทัดเดียว!
💡 Null Coalescing Operator คืออะไร?
?? เป็นตัวดำเนินการเปรียบเทียบเชิงตรรกะแบบย่อ (Shorthand) มีหน้าที่หลักคือ “ส่งคืนค่าทางซ้ายมือ หากค่านั้นมีอยู่จริงและไม่เป็น null แต่ถ้าค่าทางซ้ายไม่มีอยู่หรือเป็น null มันจะส่งคืนค่าทางขวามือแทน”
พูดให้เห็นภาพง่ายๆ มันทำงานเหมือนกับคำสั่งนี้
$result = isset($a) ? $a : $b;
แต่เมื่อใช้ ?? เราจะลดโค้ดลงเหลือแค่นี้
$result = $a ?? $b;
🛠️ เปรียบเทียบโค้ด: แบบเก่า vs แบบใหม่
เพื่อให้เห็นภาพชัดเจน ลองมาดูสถานการณ์ที่เราต้องการดึงค่า username จาก $_GET parameter ถ้าไม่มีให้ใช้คำว่า ‘Guest’
แบบเดิม (ใช้ if-else หรือ Ternary Operator)
// แบบ if-else ดั้งเดิม
if (isset($_GET['username'])) {
$username = $_GET['username'];
} else {
$username = 'Guest';
}
// แบบ Ternary Operator (? :)
$username = isset($_GET['username']) ? $_GET['username'] : 'Guest';
ข้อเสีย: โค้ดมีความยาว และต้องเขียนคำว่า $_GET['username'] ซ้ำกันสองรอบในกรณีของ Ternary
แบบใหม่ (ใช้ Null Coalescing Operator ??)
$username = $_GET['username'] ?? 'Guest';
ข้อดี: สั้น กระชับ อ่านเข้าใจได้ทันทีในบรรทัดเดียว และที่สำคัญคือ ไม่เกิด Error (Notice: Undefined index) แม้ว่า $_GET['username'] จะไม่ได้ถูกส่งมาก็ตาม
🔗 ความเจ๋งอีกขั้น: การต่อกันเป็นทอดๆ (Chaining)
เราสามารถใช้ ?? เช็คตัวแปรต่อกันหลายๆ ตัวได้ โดย PHP จะไล่เช็คจากซ้ายไปขวา และเลือกค่าแรกที่ไม่เป็น null มาใช้งานทันที
// สมมติว่าต้องการหาชื่อผู้ใช้ โดยไล่เช็คจากแหล่งต่างๆ
$username = $_GET['user'] ?? $_POST['user'] ?? $database_user ?? 'Anonymous';
จากโค้ดด้านบน ระบบจะเช็คตามลำดับ
- มี
$_GET['user']ไหม? ถ้ามีและไม่ null ให้ใช้ค่านั้น - ถ้าไม่มี ไปเช็ค
$_POST['user'] - ถ้าไม่มีอีก ไปเช็ค
$database_user - ถ้าไม่มีเลยสักอัน จึงจะใช้ค่าเริ่มต้นคือ
'Anonymous'
⚠️ ข้อควรระวัง: ?? ไม่เหมือนกับ ?: (Elvis Operator)
หลายคนมักสับสนระหว่าง ?? (Null Coalescing) และ ?: (Elvis Operator) ซึ่งทำงานคล้ายกันแต่มีจุดต่างสำคัญ
??(Null Coalescing): จะเช็คแค่ว่าตัวแปรนั้น มีอยู่จริง (isset) และไม่เป็นnullเท่านั้น?:(Elvis): จะมองค่าที่เป็นfalse,0,""(String ว่าง), หรือ[](Array ว่าง) เป็นค่าเท็จทั้งหมด และจะข้ามไปใช้ค่าทางขวาทันที แถมถ้าตัวแปรไม่มีอยู่จริง จะเกิด Undefined variable error
ตัวอย่างการเปรียบเทียบ
$action = ""; // String ว่าง
$result1 = $action ?? 'default'; // ผลลัพธ์: "" (เพราะ "" มีอยู่จริงและไม่เป็น null)
$result2 = $action ?: 'default'; // ผลลัพธ์: 'default' (เพราะ "" ถูกมองว่าเป็น false)
📌 สรุป
การนำ Null Coalescing Operator (??) ไปปรับใช้ในโปรเจกต์ PHP ของคุณ จะช่วยให้โค้ดสะอาดขึ้น ลดความซ้ำซ้อน และปลอดภัยจากการเกิด Warning/Notice เรื่องตัวแปรไม่มีอยู่จริงได้อย่างดีเยี่ยมครับ!
อ่านเพิ่มเติม