Hướng dẫn dùng copy object trong PHP

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

 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

 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

 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
Nội dung chính
     - Cách sử dụng từ khóa clone
     - Tại sao không sử dụng phép gán = mà lại sử dụng clone    
     - Ý nghĩa của clone

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.
Để sử dụng clone, ta sử dụng cú pháp sau
      $object2 = clone $object1;
#Ví dụ 1.

Ở 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.
Cho nên nó 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 $object1, mà không cần khởi tạo lại.
Kết quả ta được là    Phạm Kỳ Khôi
                                  Phạm Kỳ Khôi

2. Tại sao không sử dụng phép gán = mà lại sử dụng clone
Đây cũng là thắc mắc của rất nhiều bạn khi tìm hiểu về clone trong PHP. Vậy tại sao không sử dụng phép gán bằng 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
Ở đây, tôi sử dụng phép gán bằng cho đối tượng là $object1 và $object2. Nên các thuộc tính và phương thức của $object1 bị thay đổi bởi $object2. 
Kết quả là  Phạm Kỳ Khôi
                  Phạm Kỳ Khiêm

# Ví dụ 3
Thay vì sử dụng phép gán, lúc này tôi sử dụng từ khóa clone

Download source code
Tiếp tục, thực hiện lại ví dụ 2 ở trên. Nhưng lúc này, chúng ta sử dụng từ khóa clone để nhân bản đổi tượng $object1.
Ta thấy ở $object2, mặc dù đã thay đổi các thuộc tính và phương thức của class nhưng vẫn không ảnh hưởng gì đến $object1.
Kết quả ta được vẫn là  Phạm Kỳ Khôi
                                       Phạm Kỳ Khôi

3. Ý nghĩa của từ khóa clone.
Qua các ví dụ trên. 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. Mà không ả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.

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

Chủ Đề