【问题标题】:Can PHP generators be cloned?可以克隆 PHP 生成器吗?
【发布时间】:2014-05-16 11:56:51
【问题描述】:

在 PHP 文档中它说:

但是,这种灵活性确实是有代价的:生成器是只向前的迭代器,一旦迭代开始就不能倒带。这也意味着同一个生成器不能被多次迭代:需要通过再次调用生成器函数来重建生成器,或通过 clone 关键字进行克隆Documentation

但是,我尝试编写一个代码来克隆从方法接收到的生成器对象,但我收到一个错误,指出无法克隆生成器对象:

class Course {
    private $students = array("avi" , "haim" , "maor" , "liran" , "yossi");

    function generateStudents() {
        foreach ($this->students as $student) {
            yield $student;
        }
    }
}

$ob = new Course();
$generator = $ob->generateStudents();

// Fatal error: Trying to clone an uncloneable object of class Generator
$generator2 = clone $generator;

?>

【问题讨论】:

  • 请把你的问题说清楚。

标签: php oop clone generator


【解决方案1】:

According to the RFC,生成器无法克隆:

无法克隆生成器。

初始版本中包含对克隆的支持,但由于实现困难、语义不明确以及没有特别令人信服的用例,在 PHP 5.5 Beta 3 中删除了。

文档看起来反映了初始版本,需要更新。提出了一个documentation bug 来解决这个问题。

同样在 RFC 中,它指的是您可能不想重用生成器的原因:

在某种程度上倒带与生成器的概念背道而驰,因为它们主要用作一次性数据源,不应再次迭代。另一方面,大多数生成器可能可重绕的,允许它可能是有意义的。有人可能会争辩说,倒带生成器确实是一种不好的做法(尤其是在生成器进行一些昂贵的计算时)。让它倒带看起来像是一个廉价的操作,就像使用数组一样。

【讨论】:

  • IMO redux-saga cloneableGenerator() 和基本原理构成了一个强大且“令人信服”的示例用例。克隆生成器让您无需重复初始步骤即可轻松测试逻辑分支。
  • 此外,Generator 类不能扩展。克隆和扩展支持将允许作者在应禁止的自定义生成器上阻止克隆,或使用 __clone() 自定义克隆语义。
猜你喜欢
  • 2022-06-20
  • 1970-01-01
  • 2011-09-30
  • 2016-08-31
  • 1970-01-01
  • 2017-07-24
  • 2014-11-28
  • 2021-03-02
相关资源
最近更新 更多