แนะนำตัว
การสร้างสำเนาของวัตถุด้วยการกำหนดอย่างง่ายจะสร้างการอ้างอิงถึงวัตถุในหน่วยความจำอีกชุดหนึ่ง ดังนั้น การเปลี่ยนแปลงในแอตทริบิวต์จะสะท้อนถึงทั้งวัตถุดั้งเดิมและวัตถุที่ซ้ำกัน 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 ) )