💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ احسان زارع شریف
آموزش deep clone
محسن موحد حل شده توسط محسن موحد

سلام و وقت بخیر خدمت شما من همه کد‌ها را به غیر از این خط کد متوجه شدم 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 مستقل دارن و تغییر یکی روی دیگری اثر نمی‌ذاره.

بهترین پاسخ
محسن موحد ۰۴ شهریور ۱۴۰۳، ۰۱:۱۰