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到达0就zval被释放并且对象析构函数被调用.
下面是一些例子refcount深远0:
unset变量:
$a = new B; // refcount=1
unset($a); // refcount=0 => __destruct!
Run Code Online (Sandbox Code Playgroud)
但:
$a = new B; // refcount=1
$b = $a; // refcount=2
unset($a); // refcount=1 => no destruct as refcount > 0, even though unset() was called!
Run Code Online (Sandbox Code Playgroud)离开功能(或方法)范围
function a() {
$a = new B; // refcount=1
} // refcount=0 => __destruct! (as $a does not exist anymore)
Run Code Online (Sandbox Code Playgroud)脚本执行结束
$a = new B; // refcount=1
die(); // refcount=0 => __destruct! (on script execution end all vars are freed)
// doesn't need to be die(), can be just normal execution end
Run Code Online (Sandbox Code Playgroud)这些显然不是导致减少的所有条件refcount,而是最常见的减少条件.
另外我应该提一下,因为PHP 5.3循环引用也会被检测到.因此,如果对象$a引用了对象$b和$b引用$a,并且没有任何进一步的引用$a或两者$b的refcounts将是1,但它们仍然将被释放(和__destructed).在这种情况下,虽然破坏的顺序是未定义的行为.
| 归档时间: |
|
| 查看次数: |
5705 次 |
| 最近记录: |