Ключ в том, что вы отменяете ваши глобальные переменные, как только они вам не нужны.
Вам не нужно явно вызывать unset для локальных переменных и свойств объекта, потому что ониуничтожается, когда функция выходит из области видимости или объект уничтожается.
PHP сохраняет счетчик ссылок для всех переменных и уничтожает их (в большинстве случаев), как только этот счетчик ссылок становится равным нулю.Объекты имеют один внутренний счетчик ссылок, а сами переменные (ссылки на объекты) имеют один счетчик ссылок.Когда все ссылки на объекты были уничтожены из-за того, что их ссылочные блоки достигли 0, сам объект будет уничтожен.Пример:
$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
Но рассмотрим следующий сценарий:
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
В этих циклических ссылках включается сборщик мусора в PHP 5.3. Вы можете явно вызвать сборщик мусора с помощью gc_collect_cycles
.
См. Также Основы подсчета ссылок и Сбор циклов в руководстве.