کلون/کپی (clone)
«کلون (clone)» یعنی ساختن یک کپی از «شیء (Object)». اما توجه کن، بعضی چیزها فقط «آدرس (Reference)» کپی می شوند. پس شاید نتیجه دقیقاً مستقل نباشد.
تعریف و کاربرد ساده
کلیدواژه clone یک کپی از شیء می سازد. اگر ویژگی ها «ارجاع» باشند، آدرس کپی می شود.
مثال پایه از منبع
<?php
class MyClass {
public $color;
public $amount;
}
$obj = new MyClass();
$obj->color = "red";
$obj->amount = 5;
$copy = clone $obj;
print_r($copy);
?>
کپی با ارجاع؛ چرا نتیجه عوض می شود؟
اگر داخل شیء یک ارجاع باشد، هر دو شیء همان مقدار را نشانه می روند. پس تغییر یکی، دیگری را هم تغییر می دهد.
<?php
class MyClass {
public $amount;
}
$value = 5;
$obj = new MyClass();
$obj->amount = &$value;
$copy = clone $obj;
$obj->amount = 6;
print_r($copy);
?>
جدا کردن ارجاع با __clone()
می توانی در متد __clone() ارجاع ها را بشکنی. یعنی کپی مستقل بسازی.
<?php
class MyClass {
public $amount;
public function __clone() {
$value = $this->amount;
unset($this->amount);
$this->amount = $value;
}
}
$value = 5;
$obj = new MyClass();
$obj->amount = &$value;
$copy = clone $obj;
$obj->amount = 6;
print_r($copy);
?>
گام های عملی
- یک شیء بساز و مقدار بده.
- با
cloneاز آن کپی بگیر. - اگر ارجاع داشتی،
__clone()را پیاده سازی کن.
نکته: «ارجاع (Reference)» یعنی متغیرها به یک مکان حافظه اشاره می کنند.
برای مقدمات شیءگرایی، صفحه کلاس (class) را ببین. همچنین از کلون شیء در PHP به عنوان مرجع سریع استفاده کن.
جمع بندی سریع
cloneشیء را کپی می کند.- ارجاع ها فقط آدرس را کپی می کنند.
- با
__clone()ارجاع را می شکنی. - برای استقلال، ارجاع ها را جدا کن.