شرح صفوف ومحتوى الفقرة
إن إسناد الكائن عبر $b = $a لا ينشئ كائناً جديداً، بل يشير المتغيران إلى نفس الكائن في الذاكرة. استخدم الكلمة clone لإنشاء نسخة مستقلة.
- افتراضياً، ينفذ
clone $objنسخاً سطحياً (Shallow Copy): تُنسخ القيم المفردة والمصفوفات، لكن الخصائص التي تحمل كائنات فرعية تظل تشير لنفس الكائنات الفرعية. - عقب إنشاء النسخة السطحية، يستدعي PHP تلقائياً الدالة
__clone()داخل النسخة الجديدة (إن وُجدت) دون إعادة تشغيل__construct(). - داخل
__clone()، انسخ أي كائنات فرعية صراحةً ($this->child = clone $this->child;) لتحقيق نسخ عميق (Deep Copy) مستقل تماماً.
لأن الدالة Customer::__clone() تنسخ الكائن الفرعي $this->addr، فإن تعديل مدينة $c2 لا يؤثر إطلاقاً على مدينة $c1.
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";