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);
如果我这样做:
$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);