什么决定什么时候在PHP中销毁类对象?

Jim*_*ell 15 php destructor class instantiation

让我们说我们上课了CFoo.在以下示例中CFoo::__destruct()调用时?

function MyPHPFunc()
{
  $foo = new CFoo();

  . . .

  // When/where/how does $foo get destroyed/deleted?
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,当脚本退出范围时会调用析构函数MyPHPFunc因为$foo不再可访问吗?

Nik*_*kiC 36

在PHP中,所有值都保存在所谓的zvals中.那些zval包含实际数据,类型信息和 - 这对您的问题很重要 - 参考计数.看看以下代码段:

$a = new B; // $a         points to zval(new B) with refcount=1
$b = $a;    // $a, $b     point to  zval(new B) with refcount=2 (+1)
$c = $b;    // $a, $b, $c point to  zval(new B) with refcount=3 (+1)
unset($a);  //     $b, $c point to  zval(new B) with refcount=2 (-1)
Run Code Online (Sandbox Code Playgroud)

一旦refcount到达0zval被释放并且对象析构函数被调用.

下面是一些例子refcount深远0:

这些显然不是导致减少的所有条件refcount,而是最常见的减少条件.

另外我应该提一下,因为PHP 5.3循环引用也会被检测到.因此,如果对象$a引用了对象$b$b引用$a,并且没有任何进一步的引用$a或两者$brefcounts将是1,但它们仍然将被释放(和__destructed).在这种情况下,虽然破坏的顺序是未定义的行为.