Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

การโคลนวัตถุ PHP


แนะนำตัว

การสร้างสำเนาของวัตถุด้วยการกำหนดอย่างง่ายจะสร้างการอ้างอิงถึงวัตถุในหน่วยความจำอีกชุดหนึ่ง ดังนั้น การเปลี่ยนแปลงในแอตทริบิวต์จะสะท้อนถึงทั้งวัตถุดั้งเดิมและวัตถุที่ซ้ำกัน PHP มี โคลน คำหลักที่สร้างสำเนาตื้นของวัตถุ อย่างไรก็ตาม หากอ็อบเจ็กต์ดั้งเดิมมีอ็อบเจ็กต์ฝังตัวอื่นเป็นคุณสมบัติอย่างใดอย่างหนึ่ง อ็อบเจ็กต์ที่คัดลอกจะยังคงอ้างอิงถึงอ็อบเจ็กต์เดียวกัน ในการสร้างสำเนา eep ของอ็อบเจ็กต์ เมธอด __clone() ต้องกำหนดในคลาส/

คัดลอกตามที่ได้รับมอบหมาย

ในรหัสต่อไปนี้ myclass มีหนึ่งในแอตทริบิวต์ที่เป็นวัตถุของคลาสที่อยู่ วัตถุของ myclass ถูกทำซ้ำโดยการมอบหมาย การเปลี่ยนแปลงมูลค่าทรัพย์สินสะท้อนให้เห็นในวัตถุทั้งสอง

ตัวอย่าง

<?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);
?>

ผลลัพธ์

รหัสนี้แสดงผลลัพธ์ต่อไปนี้

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
   )

)

การใช้คีย์เวิร์ดโคลน

โคลน คำหลักสร้างสำเนาตื้น การเปลี่ยนแปลงมูลค่าของทรัพย์สินไม่ได้สะท้อนถึงวัตถุที่ลอกแบบมา อย่างไรก็ตาม หากวัตถุฝังตัวถูกแก้ไข การเปลี่ยนแปลงจะมีผลในวัตถุดั้งเดิมและวัตถุที่ลอกแบบมา

ตัวอย่าง

<?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);
?>

ผลลัพธ์

ผลลัพธ์แสดงผลดังต่อไปนี้

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
   )

)

ใช้ __clone() วิธีการ

__clone() วิธีการสร้างสำเนาลึกโดยการสร้างวัตถุฝังตัวเดียวด้วย

ตัวอย่าง

<?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);
?>

ผลลัพธ์

ผลลัพธ์แสดงผลดังต่อไปนี้

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
   )

)