Việc tạo một bản sao của một đối tượng với đầy đủ các thuộc tính được sao chép đôi khi là điều cần thiết. Một ví dụ là sự cần thiết phải sao chép các hàm tạo là nếu bạn có một đối tượng thể hiện một cửa sổ GTK và đối tượng đó chứa tài nguyên của cửa sổ GTK, khi bạn tạo bản sao bạn có thể muốn tạo một cửa sổ mới với các thuộc tính tương tự và có đối tượng mới chứa tài nguyên của cửa sổ mới. Một ví dụ khác là nếu đối tượng của bạn chứa một tham chiếu tới đối
tượng khác và khi bạn nhân bản đối tượng cha bạn muốn tạo một thể hiện mới của đối tượng khác này để việc nhân bản có bản copy độc lập của chính nó. Một đối tượng được sao chép được tạo bằng cách sử dụng từ khóa clone (điều này sẽ gọi tới phương thức __clone() của đối tượng nếu cần thiết). Phương thức __clone() của đối tượng không thể được gọi trực tiếp. Ví dụ, $copy_of_object = clone $object; Khi một đối tượng được nhân bản thì PHP 5 sẽ tạo một bản copy mức thấp
các thuộc tính của đối tượng. Bất kỳ thuộc tính nào tham chiếu tới các biến khác nhau sẽ đều được giữ giam chiếu. Cú pháp của phương thức __clone() như sau: void __clone ( void ) Sau khi nhân bản hoàn chỉnh thì phương thức __clone() sẽ được định nghĩa, khi đó phương thức __clone() của đối tượng mới được tạo sẽ được gọi, và nó cho phép bất kỳ thuộc tính cần thiết nào cũng có thể thay đổi được. Ví dụ 1: Nhân bản đối
tượng <?php public function public function class function $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj2 = clone $obj; print( "Original Object:\n");print_r($obj); print( "Cloned Object:\n");print_r($obj2); ?> Output của ví dụ trên: Original Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Cloned Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) ) Việc tạo một bản sao của một đối tượng với đầy đủ các thuộc tính được sao chép đôi khi là điều cần thiết. Một ví dụ là sự cần thiết phải sao chép các hàm tạo là nếu bạn có một đối tượng thể hiện một cửa sổ GTK và đối tượng đó chứa tài nguyên của cửa sổ GTK, khi bạn tạo bản sao bạn có thể muốn tạo một cửa sổ mới với các thuộc tính tương tự và có đối tượng mới chứa tài nguyên của cửa sổ mới. Một ví dụ khác là nếu đối tượng của bạn chứa một tham chiếu tới đối
tượng khác và khi bạn nhân bản đối tượng cha bạn muốn tạo một thể hiện mới của đối tượng khác này để việc nhân bản có bản copy độc lập của chính nó. Một đối tượng được sao chép được tạo bằng cách sử dụng từ khóa clone (điều này sẽ gọi tới phương thức __clone() của đối tượng nếu cần thiết). Phương thức __clone() của đối tượng không thể được gọi trực tiếp. Ví dụ, $copy_of_object = clone $object; Khi một đối tượng được nhân bản thì PHP 5 sẽ tạo một bản copy mức thấp
các thuộc tính của đối tượng. Bất kỳ thuộc tính nào tham chiếu tới các biến khác nhau sẽ đều được giữ giam chiếu. Cú pháp của phương thức __clone() như sau: void __clone ( void ) Sau khi nhân bản hoàn chỉnh thì phương thức __clone() sẽ được định nghĩa, khi đó phương thức __clone() của đối tượng mới được tạo sẽ được gọi, và nó cho phép bất kỳ thuộc tính cần thiết nào cũng có thể thay đổi được. Ví dụ 1: Nhân bản đối
tượng
__construct() { Output của ví dụ trên: Original Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Cloned Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) ) Việc tạo một bản sao của một đối tượng với đầy đủ các thuộc tính được sao chép đôi khi là điều cần thiết. Một ví dụ là sự cần thiết phải sao chép các hàm tạo là nếu bạn có một đối tượng thể hiện một cửa sổ GTK và đối tượng đó chứa tài nguyên của cửa sổ GTK, khi bạn tạo bản sao bạn có thể muốn tạo một cửa sổ mới với các thuộc tính tương tự và có đối tượng mới chứa tài nguyên của cửa sổ mới. Một ví dụ khác là nếu đối tượng của bạn chứa một tham chiếu tới đối tượng khác và khi bạn nhân bản đối tượng cha bạn muốn tạo một thể hiện mới của đối tượng khác này để việc nhân bản có bản copy độc lập của chính nó. Một đối tượng được sao chép được tạo bằng cách sử dụng từ khóa clone (điều này sẽ gọi tới phương thức __clone() của đối tượng nếu cần thiết). Phương thức __clone() của đối tượng không thể được gọi trực tiếp. Ví dụ, $copy_of_object = clone $object; Khi một đối tượng được nhân bản thì PHP 5 sẽ tạo một bản copy mức thấp các thuộc tính của đối tượng. Bất kỳ thuộc tính nào tham chiếu tới các biến khác nhau sẽ đều được giữ giam chiếu. Cú pháp của phương thức __clone() như sau: void __clone ( void ) Sau khi nhân bản hoàn chỉnh thì phương thức __clone() sẽ được định nghĩa, khi đó phương thức __clone() của đối tượng mới được tạo sẽ được gọi, và nó cho phép bất kỳ thuộc tính cần thiết nào cũng có thể thay đổi được. Ví dụ 1: Nhân bản đối tượng <?php public function __construct() {$this->instance = ++self::$instances; } public function __clone() {$this->instance = ++self::$instances; } } class MyCloneable{ public $object1; public $object2; function __clone(){ // Tạo bản sao của this->object, nếu không // nó sẽ trỏ đến cùng một đối tượng. $this->object1 = clone $this->object1; } } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj2 = clone $obj; print( "Original Object:\n");print_r($obj); print( "Cloned Object:\n");print_r($obj2); ?> Output của ví dụ trên: Original Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Cloned Object: MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) ) Chào các bạn, ở bài trước chúng ta đã tìm hiểu về Magic method trong PHP. Ở bài học này, tôi cùng các bạn đi tìm hiểu về clone trong PHP. Clone là một từ khóa trong PHP, cho phép nhân bản một đối tượng có sẵn mà không cần phải khởi tạo đối tượng mới. 1. Cách sử dụng. Ở ví dụ trên các bạn thấy, đối tượng $object2 của chúng ta được clone từ đối tượng $object1. 2. 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 $object2 = $object1, nếu một trong hai đối tượng này thay đổi thì đối tượng kia cũng thay đổi theo. Còn khi các bạn sử dụng clone thì các đối tượng thay đổi không phụ thuộc vào nhau, mà nó mang tính độc lập. #Ví dụ 2 Download source code # Ví dụ 3 Download source code 3. Ý nghĩa của từ khóa clone. Kết luận: Ở bài học này tôi đã giới thiệu cho các bạn về clone trong PHP . Ở bài tiếp theo tôi sẽ giới thiệu cho các bạn các kiến thức về class abstract trong PHP |