تكرار السؤال: …
الإجابة المختصرة
تُمرر الكائنات بمعرف الكائن (Object Identifier)؛ لذا فإن تعديل خصائص الكائن داخل دالة ينعكس على الكائن الأصلي دون الحاجة لعلامة &.
الشرح
في PHP، المتغيرات البدائية تُمرر بالقيمة (Copy-On-Write). أما الكائنات، فإن المتغير يحمل مجرد معرف يشير إلى الكائن الفعلي في ذاكرة الـ Zend Engine. عند تمرير الكائن لدالة، يحصل المعامل على نسخة من المعرف تشير لنفس الكائن في الذاكرة. التمييز الدقيق هو أن استبدال الكائن بالكامل داخل الدالة بـ $obj = new Other() لا يغير الأصل، ولكن $obj->prop = 5 يغير الأصل فوراً.
مثال بالكود
function modify(stdClass $o) {
$o->name = "Updated"; // ينعكس على الكائن الأصلي خارج الدالة
}
$user = (object)['name' => 'Original'];
modify($user);
echo $user->name; // Updatedأخطاء شائعة
- إضافة علامة & قبل معاملات الكائنات دون حاجة ظناً أنها ضرورية لتعديل خصائص الكائن.