PHP7.4中的循环引用
在PHP7.4中,我注意到,当循环引用对象中存在PHP7.4中的循环引用,php,cyclic-reference,php-7.4,Php,Cyclic Reference,Php 7.4,在PHP7.4中,我注意到,当循环引用对象中存在析构函数时,返回的收集循环数始终为零 class A { public function __destruct() { } } gc_disable(); $a1 = new A; $a2 = new A; $a1->ref = $a2; $a2->ref = $a1; $a1 = $a2 = NULL; echo('removed cycles: '.gc_collect_cycles()); // Outp
析构函数时,返回的收集循环数始终为零
class A {
public function __destruct() {
}
}
gc_disable();
$a1 = new A;
$a2 = new A;
$a1->ref = $a2;
$a2->ref = $a1;
$a1 = $a2 = NULL;
echo('removed cycles: '.gc_collect_cycles()); // Output: removed cycles: 0
当我删除\uu destruct
方法时,输出为:
removed cycles: 2
您可以看到这种行为从PHP开始
这是怎么回事?即使GC被禁用,垃圾循环也会在析构函数中被收集吗?自PHP 7.4以来,初始垃圾收集运行将仅对具有垃圾循环的对象调用析构函数,并且对象的实际销毁将推迟到下一次GC运行。如果对gc\u collect\u cycles()执行两个调用,则可以看到这一点:
这种行为的原因是析构函数可以引入对对象的附加引用,从而使它不再有效地销毁它。以前的版本使用了不可靠的启发式方法来检测这种情况。PHP7.4将把销毁延迟到单独的GC运行