【发布时间】:2016-04-03 10:41:31
【问题描述】:
简单的问题。
生成器何时或如何通过 PHP 或您自己销毁其堆栈?
举个例子:
function doWork(): Generator
{
// create some objects.
$o1 = new stdClass();
$o2 = new stdClass();
// pause here and wait for data.
$value = yield 1;
// By referencing the above objects, they shouldn't destruct.
$o1->property = $value;
$o2->property = $value;
yield $o1;
yield $o2;
// End of stack.
}
// Create the generator.
$generator = doWork();
$value = $generator->current(); // $value will equal 1.
if ($x) {
$generator->send('Hello, World!'); // Continue execution of the generator.
$o1 = $generator->current();
$generator->next();
$o2 = $generator->current();
$generator->next(); // Complete the generator
var_dump($o1);
var_dump($o2);
} else {
// Do nothing with the generator.
}
// Carry on with script ...
在这个例子中,一个生成器被启动并创建了两个对象。至此,它已产生,并请求进一步的数据。
到达一个 IF 语句。
案例 1
如果$x 为真,值"Hello, World!" 将被发送到生成器,并且对象将被填充它们的新属性。
下次读取产生的数据时,对象会被返回。
案例 2
如果$x 为假,则不再使用生成器。
问题
在情况 1 中,我希望堆栈像任何其他函数一样关闭,但是在情况 2 中生成器会发生什么?它和所有剩余的对象引用是否都保留在内存中直到脚本结束?
或者是否丢失了对$generator 的引用导致它,并且内部的所有引用都被清除了?
【问题讨论】:
标签: php memory garbage-collection generator php-internals