Giới thiệu
Trong PHP, đối tượng được truyền theo tham chiếu (reference) mặc định. Tham chiếu là một bí danh (alias), cho phép hai biến khác nhau ghi vào cùng một giá trị. Biến đối tượng không chứa chính đối tượng như một giá trị. Nó chỉ chứa một định danh đối tượng (object identifier) cho phép tìm thấy đối tượng thực tế. Khi một đối tượng được truyền như đối số, trả về hoặc gán, các biến khác nhau không phải là bí danh — chúng chứa một bản sao của định danh, trỏ đến cùng một đối tượng.
Ví dụ: spl_object_hash()
PHP có hàm spl_object_hash() trả về ID hash duy nhất của một đối tượng. Trong mã sau, hai biến đối tượng tham chiếu đến cùng một đối tượng trả về cùng 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);
?>
Kết quả
Kết quả cho thấy ID của cả hai biến giống nhau:
ID of obj1: 000000004355dda6000000006f04b1a7 ID of obj2: 000000004355dda6000000006f04b1a7
Tạo tham chiếu thực sự với &
Khi tạo tham chiếu của một biến đối tượng bằng cách thêm & trước tên biến, bất kỳ thay đổi nào trong thuộc tính sẽ tự động phản ánh trong biến tham chiếu:
<?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;
?>
Kết quả
ID of obj1: 00000000163cf0b8000000003ad0ed93 ID of obj2: 00000000163cf0b8000000003ad0ed93 name: Amar