Während der Garbage Collector in PHP mit Referenzen zu studieren, habe ich nicht verstanden, was die Bereinigung Probleme von Referenzen mit dem Garbage Collector, die here erwähntenProbleme mit Referenzen in PHP
$a = array('one');
$a[] =& $a;
xdebug_debug_zval('a');
unset($a);
der Verweis auf diesem Code und Abschnitt sagte
Obwohl kein Symbol in irgendeinem Bereich auf diese Struktur verweist, kann es nicht bereinigt werden, da das Array-Element "1" immer noch auf das gleiche Array zeigt. Da kein externes Symbol darauf zeigt, kann ein Benutzer diese Struktur nicht bereinigen. So bekommst du ein Speicherleck.
nach PHP Referenzen zu studieren, habe ich gelernt, dass unset die Variable Mittel, um die Bindung zwischen dem Variablennamen und Inhalt abgeholzt, so nach dem folgenden Code:
$a = array('one');
$a[] =& $a;
unset($a);
die ganze Variable einen wird $ nicht mit dem Inhalt verbunden sein, und aufgrund der Entfernung des gesamten Arrays werden auch seine Inhaltsreferenzen oder Variablen entfernt. Wo ist also das Aufräumproblem?
beachten Sie, dass nach dem folgenden Code, hier xdebug Funktion erzeugt bedeutet, dass zwei Verweise oder Zeiger oder Bindungen freigesetzt werden, was beweist, dass es nicht Bereinigung Problem ist:
$a = array('one');
$a[] =& $a;
xdebug_debug_zval('a');
Referenzen i studierte von:
php den Speicher von spezifischer Referenz befreit, wenn es keine Hinweise auf diese Referenz, also, wenn Sie das gesamte Array entfernen (das hält die zweite Referenz) , dann löscht php diesen zval-Container als keine Zeiger darauf. Eine weitere Klarstellung: Wenn das übergeordnete Array auf einen bestimmten zval-Container verweist und ein Element (untergeordnetes Element) aufweist, das auf denselben zval-Container verweist, haben Sie das übergeordnete Element entfernt, das das untergeordnete Element enthält. Dann gibt es keine Zeiger auf den gemeinsamen zval-Container. Wo also die Aufräumprobleme? – youhana
* Wenn Sie also das gesamte Array entfernen (das die zweite Referenz enthält), dann löscht php diesen zval Container als keine Zeiger darauf * falsch!Es gibt immer noch einen Zeiger auf das Array, das im Array gespeichert ist – Philipp