บทนำ
ใน PHP ออบเจ็กต์จะถูกส่งผ่าน Reference (อ้างอิง) โดยค่าเริ่มต้น Reference คืออีลีแอส (Alias) ที่ทำให้ตัวแปรสองตัวสามารถเขียนค่าไปยังค่าเดียวกันได้ ตัวแปรออบเจ็กต์ไม่ได้เก็บออบเจ็กต์เองเป็นค่า แต่เก็บ Object Identifier (ตัวระบุออบเจ็กต์) ที่ชี้ไปยังออบเจ็กต์จริงในหน่วยความจำ เมื่อส่งออบเจ็กต์เป็นอาร์กิวเมนต์ คืนค่า หรือกำหนดค่า ตัวแปรต่างๆ จะไม่ใช่ Alias แต่อย่างไรก็ตาม พวกมันจะเก็บสำเนาของ Identifier เดียวกันที่ชี้ไปยังออบเจ็กต์เดียวกัน
ตัวอย่างการตรวจสอบ Object ID
PHP มีฟังก์ชัน spl_object_hash() ที่คืนค่า Hash ID เฉพาะของออบเจ็กต์ ในโค้ดต่อไปนี้ ตัวแปรออบเจ็กต์สองตัวที่อ้างอิงออบเจ็กต์เดียวกันจะคืนค่า ID เดียวกัน:
<?php
class test1 {
public $name;
}
$obj1 = new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";
$obj2 = $obj1;
echo "ID of obj2: " . spl_object_hash($obj2);
?>
ผลลัพธ์
ผลลัพธ์แสดงว่า ID ของทั้งสองตัวแปรเหมือนกัน:
ID of obj1: 000000004355dda6000000006f04b1a7 ID of obj2: 000000004355dda6000000006f04b1a7
เมื่อเราสร้าง Reference ของตัวแปรออบเจ็กต์โดยเติม & หน้าชื่อตัวแปร การเปลี่ยนแปลงพร็อพเพอร์ตีจะสะท้อนไปยังตัวแปร Reference อัตโนมัติ:
ตัวอย่างการใช้ Reference Operator (&)
<?php
class test1 {
public $name;
}
$obj1 = new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";
$obj2 = &$obj1;
echo "ID of obj2: " . spl_object_hash($obj2) . "\n";
$obj1->name = "Amar";
echo "name: " . $obj2->name;
?>
ผลลัพธ์
ID of obj1: 00000000163cf0b8000000003ad0ed93 ID of obj2: 00000000163cf0b8000000003ad0ed93 name: Amar