ساخت یک کپی از یک شی بصورت همانندسازی کامل ویژگیها همیشه مطلوب نیست. یک نمونه خوب برای این نیاز برای کپی نمودن سازندههاست اگر یک شی نمایشٰدهنده یک پنجره GTK و شی حامل منابع این پنجره وجود داشته باشد وقتی بخواهید یک کپی از آن بسازید و پنجره جدیدی بسازید و منابع جدیدی در اختیار آن باشد. نمونه دیگر برای این مساله شی شما دارای مرجعی برای شی دیگری است که شما میخواهید شی دیگری برای آن کپی نمایید و میخواهید مرجع شی به کپی مخصوص خود اشاره نماید.
یک شی کپی با استفاده از کلمه کلیدی clone ممکن است (که متد __clone() شی را در صورت ممکن فراخوانی نمایید). متد __clone() یک شی نمیتواند مستقیما فراخوانی گردد.
$copy_of_object = clone $object;
زمانی که یک شی کپی میگردد PHP 5 یک کپی کمعمق از تمام مشخصات شی خواهد ساخت. هر ویژگی دارای ارجاع به دیگر متغیرها همان مرجعها باقی خواهد ماند. اگر یک متد__clone() تعریف شده باشد آنگاه متد __clone() شی ساخته شده جدید فراخوانی خواهد گردید تا به ویژگیهای مورد نیاز برای تغییر دسترسی داشته باشیم.
وقتی کپی کامل شد اگر متد __clone() تعریف شده باشد متد __clone() شی ساخته شده جدید فراخوانی خواهد شد تا ویژگیهای مورد نیاز تغییر داده شود.
Example #1 کپی نمودن یک شی
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?>
The above example will output:
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 ) )