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

在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()); // Output: removed cycles: 0
当我删除
\uu destruct
方法时,输出为:

removed cycles: 2
您可以看到这种行为从PHP开始


这是怎么回事?即使GC被禁用,垃圾循环也会在析构函数中被收集吗?

自PHP 7.4以来,初始垃圾收集运行将仅对具有垃圾循环的对象调用析构函数,并且对象的实际销毁将推迟到下一次GC运行。如果对gc\u collect\u cycles()执行两个调用,则可以看到这一点:

这种行为的原因是析构函数可以引入对对象的附加引用,从而使它不再有效地销毁它。以前的版本使用了不可靠的启发式方法来检测这种情况。PHP7.4将把销毁延迟到单独的GC运行