如果我这样做:
$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 )
我的观点是,我看到人们没有意识到指针没有意识到他们现在正在离开GC做他们的肮脏工作......而如果你使用未设置,我想知道它是否明确标记它可用于覆盖然后那里(删除)!
答案 0 :(得分:4)
您只会修改函数内部的变量。您的Bob
实例将继续存在,因为函数外部的变量仍在引用它。在所有对它的引用消失/无法访问之前,Bob不会收集垃圾。
对象实例存在于内存中的对象实例池中的某处。变量“持有对象”实际上只是在内存中保存该对象的标识符。如果取消设置或覆盖该引用,则不会更改对象本身。将它传递给函数时,您只需将标识符的副本传递给函数;然后看上一句话。
如果您通过引用传递它,那么您可以修改调用者的变量的内容。如果你只是unset
这个变量,它只会在函数内部取消它,所以鲍勃没有多少事情发生。只有当你通过引用传递它并将另一个值重新分配给该变量时,Bob才会收集垃圾。
即,只有在这种情况下,您才会覆盖最后一个对象引用并导致它被垃圾回收:
$bob = new Bob();
function AnnoyBob(Bob &$bob) {
$bob = NULL;
}
AnnoyBob($bob);