取消

时间:2015-05-01 13:40:36

标签: php garbage-collection

如果我这样做:

$bob = new Bob();

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

AnnoyBob( $bob );

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

$bob = new Bob();

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

AnnoyBob( $bob );

B: $bob指针现在是否立即释放内存以进行覆盖?

C:如果您在此处传递引用,该怎么办:..( Bob &$bob )

enter image description here

我的观点是,我看到人们没有意识到指针没有意识到他们现在正在离开GC做他们的肮脏工作......而如果你使用未设置,我想知道它是否明确标记它可用于覆盖然后那里(删除)!

1 个答案:

答案 0 :(得分:4)

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

对象实例存在于内存中的对象实例池中的某处。变量“持有对象”实际上只是在内存中保存该对象的标识符。如果取消设置或覆盖该引用,则不会更改对象本身。将它传递给函数时,您只需将标识符的副本传递给函数;然后看上一句话。

如果您通过引用传递它,那么您可以修改调用者的变量的内容。如果你只是unset这个变量,它只会在函数内部取消它,所以鲍勃没有多少事情发生。只有当你通过引用传递它并将另一个值重新分配给该变量时,Bob才会收集垃圾。

即,只有在这种情况下,您才会覆盖最后一个对象引用并导致它被垃圾回收:

$bob = new Bob();

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

AnnoyBob($bob);