انتقل إلى محتوى الدرس

Copying Objects with clone and __clone نسخ الكائنات بالكلمة clone والنسخ العميق في __clone

خصّص سلوك الكائنات في PHP 8 عبر الدوال السحرية __toString و__invoke و__clone، وافهم النسخ السطحي والعميق ومقارنة الكائنات.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

إن إسناد الكائن عبر $b = $a لا ينشئ كائناً جديداً، بل يشير المتغيران إلى نفس الكائن في الذاكرة. استخدم الكلمة clone لإنشاء نسخة مستقلة.

  • افتراضياً، ينفذ clone $obj نسخاً سطحياً (Shallow Copy): تُنسخ القيم المفردة والمصفوفات، لكن الخصائص التي تحمل كائنات فرعية تظل تشير لنفس الكائنات الفرعية.
  • عقب إنشاء النسخة السطحية، يستدعي PHP تلقائياً الدالة __clone() داخل النسخة الجديدة (إن وُجدت) دون إعادة تشغيل __construct().
  • داخل __clone()، انسخ أي كائنات فرعية صراحةً ($this->child = clone $this->child;) لتحقيق نسخ عميق (Deep Copy) مستقل تماماً.

لأن الدالة Customer::__clone() تنسخ الكائن الفرعي $this->addr، فإن تعديل مدينة $c2 لا يؤثر إطلاقاً على مدينة $c1.

مخطط تدفق التنفيذ العملي لقسم نسخ الكائنات بالكلمة clone والنسخ العميق في __clone في لغة PHP
PHP
<?php
class Address { public function __construct(public string $city) {} }
class Customer {
    public function __construct(public string $name, public Address $addr) {}
    public function __clone(): void {
        $this->addr = clone $this->addr;
    }
}
$c1 = new Customer("Sara", new Address("Riyadh"));
$c2 = clone $c1;
$c2->addr->city = "Jeddah";
echo "c1={$c1->addr->city}, c2={$c2->addr->city}\n";