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