Computer >> Máy Tính >  >> Lập trình >> PHP

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

Giới thiệu

Tạo bản sao của một đối tượng bằng phép gán đơn giản chỉ tạo ra một tham chiếu khác đến đối tượng trong bộ nhớ. Do đó, những thay đổi trong thuộc tính phản ánh cả trong đối tượng gốc và đối tượng trùng lặp. PHP có bản sao từ khóa tạo ra một bản sao nông của đối tượng. Tuy nhiên, nếu đối tượng gốc có đối tượng nhúng khác làm một trong các thuộc tính của nó, thì đối tượng được sao chép vẫn tham chiếu đến đối tượng tương tự. Để tạo một bản sao eep ​​của đối tượng, phương thức ma thuật __clone () cần được xác định trong lớp /

Sao chép theo nhiệm vụ

Trong đoạn mã sau, myclass có một trong các thuộc tính là đối tượng của lớp địa chỉ. Một đối tượng của myclass được sao chép bằng cách gán. Sự thay đổi về giá trị của mức độ tốt được phản ánh trong cả hai đối tượng

Ví dụ

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object\n";
print_r($obj1);
$obj2=$obj1;
$obj1->setname("Ravi");
echo "after change:\n";
print_r($obj1);
print_r($obj2);
?>

Đầu ra

Mã này hiển thị kết quả sau

original object
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )
)
after change:
original object
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )
)
copied object
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)

Sử dụng từ khóa sao chép

Bản sao từ khóa tạo ra một bản sao cạn. Thay đổi giá trị của thuộc tính không phản ánh trong đối tượng nhân bản. Tuy nhiên, nếu đối tượng nhúng được sửa đổi, các thay đổi sẽ được phản ánh trong đối tượng gốc và đối tượng nhân bản

Ví dụ

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

Đầu ra

Đầu ra hiển thị kết quả sau

original object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)
after change:
original object:
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)
cloned object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)

Sử dụng phương thức __clone ()

__clone () phương thức tạo một bản sao sâu bằng cách tạo một đối tượng nhúng duy nhất

Ví dụ

<?php
class address{
   var $city="Nanded";
   var $pin="431601";
   function setaddr($arg1, $arg2){
      $this->city=$arg1;
      $this->pin=$arg2;
   }
}
class myclass{
   var $name="Raja";
   var $obj;
   function setname($arg){
      $this->name=$arg;
   }
   public function __clone() {
      $this->obj = clone $this->obj ;
   }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

Đầu ra

Đầu ra hiển thị kết quả sau

original object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)
after change:
original object:
myclass Object(
   [name] => Ravi
   [obj] => address Object(
      [city] => Mumbai
      [pin] => 400001
   )

)
cloned object:
myclass Object(
   [name] => Raja
   [obj] => address Object(
      [city] => Nanded
      [pin] => 431601
   )

)