PHP 无效时的垃圾回收

PHP Garbage collection when nullifying

如果我这样做:

$bob = new Bob();

function AnnoyBob( Bob $bob )
{
    $bob = NULL;
} // < A 

AnnoyBob( $bob );

A: $bob 现在是否失去了对原始指针的引用,现在指向 NULL 因此必须在下一次 GC 上收集?

$bob = new Bob();

function AnnoyBob( Bob $bob )
{
    unset( $bob );
} // < B    

AnnoyBob( $bob );

B:$bob指针现在是不是瞬间释放内存进行覆盖?

C: 如果您要在此处传递参考会怎样:..( Bob &$bob )

我的意思是,我看到人们取消指针并没有意识到他们现在正在离开 GC 去做他们肮脏的工作......而如果你使用 unset,我想知道它是否明确标记它可以用于覆盖然后还有(已删除)!

您只会修改函数内的变量。您的 Bob 实例将继续存在,因为函数外部的变量仍在引用它。在 所有 对它的引用 gone/have 变得不可访问之前,Bob 不会收集垃圾。

一个对象实例存在于内存中对象实例池的某处。变量 "holding an object" 实际上只是在内存中保存该对象的标识符。如果您取消设置或覆盖该引用,对象本身不会改变。将其传递给函数时,您只是将标识符的副本传递给函数;然后看上一句

如果您通过引用传递它,那么您可以修改调用者变量的内容。如果你只是 unset 这个变量,它只会在函数内取消设置,所以 Bob 不会有什么大的变化。仅当您通过引用传递它并将另一个值重新分配给该变量时,Bob 才会被垃圾收集。

也就是说,只有在这种情况下,您才会覆盖最后一个对象引用并使其成为垃圾收集器:

$bob = new Bob();

function AnnoyBob(Bob &$bob) {
    $bob = NULL;
}

AnnoyBob($bob);