سلام و وقت بخیر خدمت شما من همه کدها را به غیر از این خط کد متوجه شدم public function __clone() { $this->address = clone $this->address; } نمیدونم دقیقا این چی میگه
سلام،
توضیحات رو قدم به قدم میارم تا متوجه موضوع بشی...
1. فرض کن یه کلاس ساده داری:
یه کلاس داریم به اسم Address که فقط یه ویژگی داره، یعنی city:
class Address
{
public $city;
}
و یه کلاس دیگه به اسم Person که یه ویژگی name و یه ویژگی address داره:
class Person
{
public $name;
public $address;
}
2. ساختن یه شیء:
حالا فرض کن یه شیء از کلاس Person میسازی:
$address = new Address();
$address->city = 'Tehran';
$person1 = new Person();
$person1->name = 'Ali';
$person1->address = $address;
اینجا person1 یه آدم به اسم "Ali" داره که توی "Tehran" زندگی میکنه.
3. بدون استفاده از clone:
حالا فرض کن میخوای person1 رو به یه متغیر دیگه مثل person2 کپی کنی:
$person2 = $person1;
توی این حالت، person2 دقیقاً همون person1 هست. یعنی هر تغییری که توی person2 بدی، روی person1 هم اثر میذاره. مثلاً اگه شهر person2 رو عوض کنی:
$person2->address->city = 'Shiraz';
حالا اگه city رو توی person1 چک کنی، میبینی که "Shiraz" شده:
echo $person1->address->city; // Shiraz
4. استفاده از clone:
حالا میخوای یه کپی واقعی و جدا از person1 بسازی:
$person2 = clone $person1;
در این حالت، person2 یه کپی جداگانه از person1 میشه. اما یه مشکل هست: ویژگی address همچنان به همون address قبلی اشاره میکنه. یعنی اگه city رو توی person2 عوض کنی، هنوز هم روی person1 اثر میذاره.
5. اضافه کردن متد __clone():
حالا اینجاست که متد __clone() به کار میاد. این متد رو به کلاس Person اضافه میکنی تا مطمئن بشی که address هم به صورت جداگانه کپی میشه:
class Person
{
public $name;
public $address;
public function __clone() {
$this->address = clone $this->address;
}
}
6. جمعبندی:
حالا اگه دوباره person1 رو کپی کنی:
$person2 = clone $person1;
و city رو توی person2 تغییر بدی:
$person2->address->city = 'Shiraz';
این تغییر دیگه روی person1 اثر نمیذاره:
echo $person1->address->city; // Tehran
با استفاده از __clone() مطمئن میشی که address توی person2 یه شیء کاملاً جداست و تغییراتش روی person1 هیچ تأثیری نداره. این یعنی person1 و person2 هر کدوم یه address مستقل دارن و تغییر یکی روی دیگری اثر نمیذاره.