Truyền đối tượng bằng tham chiếu trong OOP PHP
Giả sử chúng ta có lớp User như sau:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Giả sử chúng ta tạo một đối tượng của lớp này:
<?php
$user = new User('john', 30);
?>
Bây giờ hãy tưởng tượng tình huống sau: bạn
muốn gán giá trị của biến $user cho
một biến khác, chẳng hạn là
$test.
Nếu không phải là đối tượng mà là kiểu dữ liệu nguyên thủy,
tức là chuỗi, số, mảng, v.v.,
thì biến $test sẽ nhận được một bản sao
giá trị của biến $user.
Điều này có nghĩa là việc thay đổi bất kỳ biến nào sau đó sẽ không làm thay đổi giá trị của biến kia. Hãy xem ví dụ:
<?php
$user = 1;
$test = $user; // biến $test giờ có giá trị 1
$test = 2; // biến $test giờ có giá trị 2, còn $user vẫn là 1
?>
Với đối tượng thì khác - khi gán cho một biến khác, đối tượng không được sao chép, mà được truyền bằng tham chiếu: điều này có nghĩa là cả hai biến này đều có giá trị là một đối tượng duy nhất. Điều này có một hệ quả quan trọng: nếu thay đổi một số thuộc tính của đối tượng bằng một biến, thì biến thứ hai cũng sẽ xuất hiện những thay đổi này.
Hãy cùng xem trên thực tế. Tạo một đối tượng người dùng:
<?php
$user = new User('john', 30);
?>
Gán đối tượng cho một biến khác:
<?php
$test = $user;
?>
Thay đổi thuộc tính name
trong biến $test
<?php
$test->name = 'eric';
?>
Hãy kiểm tra xem đối tượng chung đã thay đổi chưa.
In ra thuộc tính name
từ biến $user:
<?php
echo $user->name; // sẽ in ra 'eric'!
?>
Tạo lớp Product, trong đó
có các thuộc tính sau: name,
price.
Tạo một đối tượng của lớp Product, ghi
nó vào biến $product1.
Gán giá trị của biến $product1
cho biến $product2. Kiểm tra
xem cả hai biến đều tham chiếu đến một
đối tượng duy nhất.