La chiave è che si unset le variabili globali non appena non ne hai bisogno.
Non è necessario chiamare unset in modo esplicito per le variabili locali e le proprietà dell'oggetto perché queste vengono distrutte quando la funzione esce dall'ambito o l'oggetto viene distrutto.
PHP mantiene un conteggio di riferimento per tutte le variabili e le distrugge (nella maggior parte delle condizioni) non appena questo conteggio dei riferimenti passa a zero. Gli oggetti hanno un conteggio di riferimento interno e le variabili stesse (i riferimenti all'oggetto) hanno ciascuno un conteggio di riferimenti. Quando tutti i riferimenti agli oggetti sono stati distrutti perché i loro coutn di riferimento hanno raggiunto 0, l'oggetto stesso verrà distrutto. Esempio:
$a = new stdclass; //$a zval refcount 1, object refcount 1
$b = $a; //$a/$b zval refcount 2, object refcount 1
//this forces the zval separation because $b isn't part of the reference set:
$c = &$a; //$a/$c zval refcount 2 (isref), $b 1, object refcount 2
unset($c); //$a zval refcount 1, $b 1, object refcount 2
unset($a); //$b refcount 1, object refcount 1
unset($b); //everything is destroyed
Ma consideri il seguente scenario:
class A {
public $b;
}
class B {
public $a;
}
$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;
unset($a); //cannot destroy object $a because $b still references it
unset($b); //cannot destroy object $b because $a still references it
Questi riferimenti ciclici sono dove PHP 5.3 di calci garbage collector in È possibile richiamare esplicitamente il garbage collector con gc_collect_cycles
..
Vedere anche Reference Counting Basics e Collecting Cycles nel manuale.