bug ของ foreach กับตัวแปร $value

วันนี้เจอข้อผิดพลาด (bug) แปลกๆของ PHP อันเกิดจากฟังก์ชั่น foreach ของ PHP ร่วมกับตัวแปร $value
foreach ($options as $k => $v) {
   $sel = isset($value) && $value == $k ? ' selected' : '';
   $datas[] = '<option value="'.$k.'"'.$sel.'>'.$v.'</option>';
}

ลูปด้านบนไม่สามารถแสดงผลได้อย่างถูกต้อง หากไม่มีการกำหนดค่าของ $value มาก่อน (ตัวอย่างนี้ใช้ isset ในการตรวจสอบ) โดยผลจากการ debug ตรวจสอบพบว่ามี $value เกิดขึ้นมา หลังจากบรรทัด $sel = isset($value) && $value == $k ? ' selected' : ''; โดย $value จะมีค่าตามตัวแปร $k ก่อนหน้า ซึ่งผมเดาว่าเกิดจากข้อผิดพลาดของ foreach (การทดสอบนี้ทำบน PHP 5.6) ที่อาจมีการใช้ตัวแปร $value ในการทำงานของฟังก์ชั่น
$value = isset($value) ? $value : $null;
foreach ($options as $k => $v) {
   $sel = $value == $k ? ' selected' : '';
   $datas[] = '<option value="'.$k.'"'.$sel.'>'.$v.'</option>';
}

หลังจากการทดสอบไปหลายรอบพบว่าหากมีการกำหนดค่าตัวแปร $value มาก่อน ปัญหานี้จะไม่เกิดขึ้น ผมเลยย้ายการทดสอบ $value ออกไปไว้ก่อน foreach ตามตัวอย่างด้านบน โดยมีเงื่อนไขว่าหากไม่มีการกำหนดค่า $value มาก่อน ให้ $value มีค่า null แทน

จากการตรวจสอบซ้ำ พบว่าปัญหานี้เกิดกับตัวแปร $value เท่านั้นนะครับ ถ้าเปลี่ยนตัวแปรนี้เป็นชื่ออื่น (เช่น $x) จะไม่พบว่ามีปัญหาแต่อย่างใด
ผู้เขียน goragod โพสต์เมื่อ 24 พ.ย. 2558 เปิดดู 3,013 ป้ายกำกับ PHP
^