Trong PHP, các đối tượng luôn được truyền theo tham chiếu, không phải theo giá trị. Điều này có nghĩa là khi bạn truyền một đối tượng vào một hàm hoặc gán nó cho một biến khác, cả hai biến đều tham chiếu đến cùng một đối tượng trong bộ nhớ. Nếu bạn thay đổi đối tượng thông qua một trong hai biến, sự thay đổi đó sẽ có hiệu lực trên cả hai, vì chúng đều trỏ đến cùng một đối tượng.
Tại sao PHP truyền đối tượng theo tham chiếu?
- Hiệu suất: Các đối tượng trong PHP có thể lớn và phức tạp. Nếu PHP truyền đối tượng theo giá trị, nó sẽ phải sao chép toàn bộ đối tượng vào bộ nhớ mới, gây tiêu tốn tài nguyên và giảm hiệu suất. Khi truyền theo tham chiếu, PHP chỉ cần tạo một tham chiếu mới đến đối tượng ban đầu mà không cần sao chép toàn bộ đối tượng.
- Hành vi mong đợi: Đối tượng đại diện cho một thực thể có trạng thái có thể thay đổi. Khi bạn làm việc với một đối tượng, bạn thường mong muốn mọi sự thay đổi đối với nó sẽ được duy trì, cho dù thông qua biến gốc hay biến được truyền vào. Truyền theo tham chiếu đảm bảo rằng mọi thay đổi với đối tượng đều được phản ánh trên tất cả các tham chiếu đến đối tượng đó.
Ví dụ minh họa
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
function changeName($obj) {
$obj->name = "New Name";
}
$person = new Person("Old Name");
changeName($person);
echo $person->name; // Output: New Name
Trong ví dụ trên, đối tượng $person
được truyền vào hàm changeName()
theo tham chiếu. Bên trong hàm, tên của đối tượng thay đổi từ “Old Name” thành “New Name”. Khi kiểm tra giá trị của $person->name
bên ngoài hàm, chúng ta thấy rằng giá trị đã thay đổi, chứng tỏ cả biến gốc và biến trong hàm đều tham chiếu đến cùng một đối tượng.
Khác biệt với kiểu dữ liệu cơ bản
Trong khi các đối tượng được truyền theo tham chiếu, các kiểu dữ liệu cơ bản như số nguyên, chuỗi, và mảng lại thường được truyền theo giá trị. Điều này có nghĩa là nếu bạn truyền một biến kiểu dữ liệu cơ bản vào một hàm, PHP sẽ sao chép giá trị của biến đó, và các thay đổi bên trong hàm sẽ không ảnh hưởng đến biến gốc.
Ví dụ:
function changeValue($x) {
$x = 10;
}
$y = 5;
changeValue($y);
echo $y; // Output: 5
Trong trường hợp này, $y
không thay đổi vì nó được truyền theo giá trị, không phải tham chiếu.
Tổng kết:
- Đối tượng trong PHP luôn được truyền theo tham chiếu, nhằm tối ưu hiệu suất và giữ trạng thái đồng bộ.
- Các kiểu dữ liệu cơ bản thì ngược lại, chúng được truyền theo giá trị, trừ khi bạn sử dụng ký hiệu
&
để truyền chúng theo tham chiếu.