简单的问题.
何时或如何,由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
为true,则将值"Hello, World!"
发送到生成器,并使用新属性填充对象.
下次读取生成的数据时,将返回对象.
案例2
如果$x
为false,则不再使用发生器.
题
在案例1中,我希望堆栈像任何其他函数一样关闭,但在案例2中发生器会发生什么?在脚本结束之前,它和所有剩余的对象引用是否都保留在内存中?
或者引用$generator
它的引用是否丢失,以及内部的所有引用都被清除掉了?
在两种情况下,生成器会破坏其执行上下文(还包括变量表):
如果生成器完成执行。这可以通过执行return
(包括在函数末尾的隐式返回)或通过在生成器执行期间发生未捕获的异常来发生。
如果所有对生成器对象的引用都被放弃。
因此,不,在脚本结束之前,生成器将不存在。一旦$generator
变量超出范围,它将被销毁,此时生成器将放弃对变量值和其他执行状态的引用。
通过echo
在析构函数中创建一个类,然后将该类实例化为局部变量,可以轻松观察破坏顺序。