تعليمات التنفيذ
1. أضف عدادًا مرجعيًا إلى الكائن وستزداد قيمة العداد المرجعي في كل مرة. عندما يصبح المرجع غير صالح، يتم تقليل العداد بمقدار واحد.
إذا تم تقليل إعادة حساب قيمة المتغير بمقدار واحد وأصبح يساوي 0، فسيتم تحرير القيمة ولن تكون غير مرغوب فيها. جامع القمامة لا يتعامل معها.
إذا كان إعادة حساب قيمة المتغير أكبر من 0 بعد تخفيضه بمقدار واحد، فسيتم اعتبار القيمة غير قابلة للإصدار وقد تصبح غير صالحة.
2. يقوم جامع القمامة بجمع القمامة المحتملة بعد الوصول إلى كمية معينة، ويبدأ برنامج تحديد القمامة ويطلق القمامة الحقيقية.
مثال
<?php // حالة آلية جمع البيانات المهملة PHP: راجع دليل php //--------------------النوع العددي-------------------- // نصيحة: كل متغير PHP موجود في حاوية متغيرة تسمى "zval"، والتي تحتوي على نوع وقيمة المتغير، "is_ref": سواء كان متغيرًا مرجعيًا، "refcount": عدد المراجع // على سبيل المثال: إنشاء حاوية zval جديدة $a = 'new string'; // على سبيل المثال: عرض معلومات حاوية zval xdebug_debug_zval('a'); // a: (refcount=1, is_ref=0),string 'new string' (length=10) // على سبيل المثال: زيادة العدد المرجعي لحاوية zval $c = $b = $a; xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'new string' (الطول=10) xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'new string' (length=10) xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'new string' (الطول=10) // نصيحة: توجد حاوية واحدة فقط في هذا الوقت، لأن PHP لن تنسخ حاوية المتغير التي تم إنشاؤها عندما لا تكون ضرورية // في هذا الوقت، ترتبط حاوية المتغير هذه بالمتغير أ، والمتغير ب، والمتغير ج. unset($b); // على سبيل المثال: تقليل عدد المراجع xdebug_debug_zval('a'); // نصيحة: unset عند حذف متغير، يتم تقليل عدد متغيرات إعادة العد بمقدار واحد. في هذا الوقت، يشير $a و$b فقط إلى حاوية المتغير. غير محدد($a); غير محدد($c); var_dump($a); // نصيحة: في هذا الوقت، إعادة العد هي 0 ويتم حذف المتغير // عندما تصبح إعادة العد 0، سيتم حذف حاوية المتغير التي تحتوي على النوع والقيمة من الذاكرة. //--------------------النوع المركب------------ echo '--------------النوع المركب------------<br/>'; $أ = صفيف( 'الاسم' => 'المبتدئ'، "العمر" => 18 ); xdebug_debug_zval('a'); // أ:(refcount=1, is_ref=0), // المصفوفة (الحجم = 2) // 'name' => (refcount=1, is_ref=0)، السلسلة 'junior' (الطول=6) // 'age' => (refcount=1, is_ref=0),int 18 // على سبيل المثال: إضافة عنصر موجود إلى المصفوفة $a['love'] = $a['name']; xdebug_debug_zval('a'); // أ:(refcount=1, is_ref=0), // المصفوفة (الحجم = 3) // 'name' => (refcount=2, is_ref=0)، السلسلة 'junior' (الطول=6) // 'age' => (refcount=1, is_ref=0),int 18 // 'الحب' => (refcount=2, is_ref=0),سلسلة 'صغار' (الطول=6) // $a = array('one'); // xdebug_debug_zval('a'); // // $b = &$a; // $c = $a; // $b = &$c; // xdebug_debug_zval('b'); // xdebug_debug_zval('c'); // xdebug_debug_zval('a'); // تنظيف مشكلة حاوية المتغير echo '------------ مشكلة تسرب الذاكرة----------<br/>'; $a = المصفوفة('واحد'); xdebug_debug_zval('a'); // أ:(refcount=1, is_ref=0), // المصفوفة (الحجم = 1) // 0 => (refcount=1, is_ref=0),سلسلة 'واحد' (الطول=3) $a[] = &$a; xdebug_debug_zval('a'); // أ:(refcount=2, is_ref=1), // المصفوفة (الحجم = 2) // 0 => (refcount=1, is_ref=0),سلسلة 'واحد' (الطول=3) // 1 => (refcount=2, is_ref=1), // &صفيف // غير محدد($a); // (refcount=1, is_ref=1)=array ( // 0 => (refcount=1, is_ref=0)='one', // 1 => (refcount=1, is_ref=1)=... // ) // نصيحة: بعد unset($a)، يتم تقليل عدد المرجع بمقدار واحد، على الرغم من عدم وجود أي رمز في النطاق يشير إلى هذه البنية (أي حاوية المتغير)، // نظرًا لأن عنصر المصفوفة "1" لا يزال يشير إلى المصفوفة نفسها، فلا يمكن مسح هذه الحاوية // نظرًا لعدم وجود رمز آخر يشير إليها، فلا توجد طريقة لدى المستخدم لمسح هذه البنية، مما يؤدي إلى تسرب الذاكرة // لحسن الحظ سيتم مسح بنية البيانات هذه في نهاية تنفيذ البرنامج النصي، ولكن سيتم استهلاك قدر كبير من الذاكرة قبل أن تقوم PHP بمسحها. // يحدث نفس الشيء مع الكائنات، في الواقع من المرجح أن يحدث مع الكائنات لأنه يتم دائمًا الإشارة إلى الكائنات ضمنيًا.
ما ورد أعلاه هو كيفية تنفيذ العد المرجعي لـ PHP لجمع البيانات المهملة، وآمل أن يكون مفيدًا للجميع.