วัน: 10 มกราคม 2016

ทำความรู้จัก PHP Null Coalescing Operator (??): ตัวช่วยลดโค้ด Clean ขึ้น x10ทำความรู้จัก PHP Null Coalescing Operator (??): ตัวช่วยลดโค้ด Clean ขึ้น x10

เคยไหมที่คุณต้องเขียนโค้ดเช็คค่า 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';

จากโค้ดด้านบน ระบบจะเช็คตามลำดับ

  1. มี $_GET['user'] ไหม? ถ้ามีและไม่ null ให้ใช้ค่านั้น
  2. ถ้าไม่มี ไปเช็ค $_POST['user']
  3. ถ้าไม่มีอีก ไปเช็ค $database_user
  4. ถ้าไม่มีเลยสักอัน จึงจะใช้ค่าเริ่มต้นคือ '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 เรื่องตัวแปรไม่มีอยู่จริงได้อย่างดีเยี่ยมครับ!


อ่านเพิ่มเติม