当前位置:  开发笔记 > 编程语言 > 正文

PHP生成器 - 垃圾收集

如何解决《PHP生成器-垃圾收集》经验,为你挑选了1个好方法。

简单的问题.

何时或如何,由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它的引用是否丢失,以及内部的所有引用都被清除掉了?



1> NikiC..:

在两种情况下,生成器会破坏其执行上下文(还包括变量表):

    如果生成器完成执行。这可以通过执行return(包括在函数末尾的隐式返回)或通过在生成器执行期间发生未捕获的异常来发生。

    如果所有对生成器对象的引用都被放弃。

因此,不,在脚本结束之前,生成器将不存在。一旦$generator变量超出范围,它将被销毁,此时生成器将放弃对变量值和其他执行状态的引用。

通过echo在析构函数中创建一个类,然后将该类实例化为局部变量,可以轻松观察破坏顺序。

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有