关键是,只要不需要全局变量,就立即取消设置它们。
您不需要为局部变量和对象属性显式调用 unset,因为当函数超出范围或对象被销毁时,这些属性会被销毁。
PHP 保留所有变量的引用计数,并在此引用计数变为零后立即销毁它们(在大多数情况下)。对象有一个内部引用计数,变量本身(对象引用)每个都有一个引用计数。当所有对象引用都因其引用 coutns 已达到 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
显式调用垃圾回收器。
另请参阅手册中的参考计数基础知识和收集周期。