PHP的gc_enable函数究竟做了什么?

Ste*_*hen 14 php garbage-collection function

在您告诉我阅读本手册之前,请查看php.net文档以获取此功能:

警告
此功能目前未记录; 只有它的参数列表可用.

那很有帮助!

该页面解释了它为循环引用启用了垃圾收集.这在何时何地有用?有人能告诉我一个使用它的例子吗?优选地,创建然后收集循环引用的示例.

rye*_*guy 15

gc_enable只有你打电话才需要gc_disable.实际上没有合理的理由这样做,因为这会导致循环引用不被垃圾收集(如5.3之前,当循环GC不存在时).

PHP的垃圾收集器通过引用计数工作.您可以将变量视为对象的"指针".当一个对象没有指针时,它就"死了",因为没有东西可以到达它,所以它是垃圾收集的.

//one thing points to the Foo object
$a = new Foo();

//now two things do
$b = $a;

//now only $b points to it
$a = null;

//now nothing points to Foo, so php garbage collects the object
$b = null;
Run Code Online (Sandbox Code Playgroud)

考虑一下这个:

$a = new Foo();
$b = new Bar();
$b->foo = $a;
$a->bar = $b;

$a = $b = null;
Run Code Online (Sandbox Code Playgroud)

此时,除了对象本身之外,没有任何东西可以保留$ a或$ b.这是一个循环引用,并且在以前版本的php(<5.3)中,将不会收集.5.3中的循环收集器现在可以检测到这个并清理这些对象.


Gor*_*don 8

PHP手册中关于垃圾收集的完整章节解释了这一点:

我通常不会只是将异地链接起来,但总觉得它太过分了.