Nhân bản đối tượng trong PHP

Nhân bản đối tượng trong PHP hay PHP Object Cloning là việc chúng ta sẽ nhân bản một đối tượng nào đó để tạo ra một bản sao của chính nó. Bản sao đối tượng đó được tạo ra bằng cách sử dụng từ khóa clone và bạn không được gọi trực tiếp phương thức __clone(). Trong PHP việc nhân bản một đối tượng ...

Nhân bản đối tượng trong PHP hay PHP Object Cloning là việc chúng ta sẽ nhân bản một đối tượng nào đó để tạo ra một bản sao của chính nó. Bản sao đối tượng đó được tạo ra bằng cách sử dụng từ khóa clone và bạn không được gọi trực tiếp phương thức __clone(). Trong PHP việc nhân bản một đối tượng đang thực hiện theo chiều nông chứ không phải theo chiều sâu. Điều đó có nghĩa là đối tượng chứa cái đối tượng được sao chéo thì không được sao chép. Nếu bạn muốn có một bản sao theo chiều sâu, thì bạn cần xác định qua phương thức __clone ().

1. Nhân bản đối tượng bằng phép gán(assign)

Trong một vài trường hợp, chúng ta muốn nhân bản một đối tượng bằng cách sử dụng toán tử gán. Với cách làm như vậy thì chúng ta hoàn toàn có thể sử dụng lại toàn bộ những thuộc tính và phương thức của đối tượng bị nhân bản, mà không cần khởi tạo lại.

Ví dụ.

<?php
class Animals{
	public $name;
	public $category;
}

// Khởi tạo một đối tượng
$objAnimals = new Animals();

// Gán thuộc tính
$objAnimals->name = "Sư tử";
$objAnimals->category = "Động vật hoang dã";

//Nhân bản đối tượng
$objCopied = $objAnimals;
$objCopied->name = "Con mèo";
$objCopied->category = "Thú cưng";

print_r($objAnimals);
print_r($objCopied);
?>

  Run

Khi chạy đoạn code trên bạn sẽ thu được một kết quả:

Animals Object
(
    [name] => Con mèo
    [category] => Thú cưng
)
Animals Object
(
    [name] => Con mèo
    [category] => Thú cưng
)

Từ đó bạn sẽ đưa ra nhận xét.

  • Khi bạn thay đổi đối tượng nhân bản nó sẽ ảnh hưởng trực tiếp tới đối tượng bị nhân bản.

2. Nhân bản đối tượng bằng từ khoá clone.

Trong phần này chúng ta đang sao chép các đối tượng bằng cách sử dụng từ khoá clone. Phương pháp nhân bản PHP sẽ làm bản sao nông cạn và do đó bất kỳ thay đổi nào được thực hiện trong đối tượng nhân bản sẽ không ảnh hưởng đến đối tượng gốc.

__clone là một phương thức magic trong PHP. Phương thức Magic được xác định trước trong PHP và bắt đầu bằng "__" (double gạch dưới). Chúng được thực hiện nhằm trả về một số sự kiện trong PHP.

<?php
	class Animals
	{
		public $name;
		public $category;
	}
	
	// Khởi tạo một đối tượng
	$objAnimals = new Animals();
	
	// Gán thuộc tính
	$objAnimals->name = "Sư tử";
	$objAnimals->category = "Động vật hoang dã";
	
	//Nhân bản đối tượng
	$objCloned = clone $objAnimals;
	$objCloned->name = "Con mèo";
	$objCloned->category = "Thú cưng";
	
	print_r($objAnimals);
	print_r($objCloned);
?>

  Run

Kết quả khi bạn chạy đoạn code trên.

Animals Object
(
    [name] => Sư tử
    [category] => Động vật hoang dã
)
Animals Object
(
    [name] => Con mèo
    [category] => Thú cưng
)

=>Từ đó bạn rút ra được kết luận gì khi sử dụng toán tử gán và từ khóa clone.

3. Tại sao không sử dụng phép gán = mà lại sử dụng clone. 

Đơn giản là như thế này: Khi các bạn sử dụng phép gán bằng ở đây mình lấy ví dụ là $object2 = $object1, Thì nếu một trong hai đối tượng này thay đổi thì ngay lập tức đối tượng kia cũng sẽ thay đổi theo. Còn ngược lại khi các bạn sử dụng clone thì khi các đối tượng thay đổi chúng sẽ không phụ thuộc vào nhau, mà nó mang tính độc lập.

4. Tổng kết.

Qua bài vieetst này cho thấy, việc sử dụng từ khóa clone trong PHP cho phép ta hoàn toàn có thể tạo ra một đối tượng mới từ đối tượng có sẵn và không làm ảnh hướng hay làm mất đi dữ liệu của đối tượng ban đầu.Việc không phải khởi tạo đối tượng, sẽ tiết kiệm bộ nhớ. Điều này giúp ứng dụng của chúng nhanh hơn.

0