【问题标题】:Override a generator method within a class覆盖类中的生成器方法
【发布时间】:2019-05-22 17:06:45
【问题描述】:

我在一个类中有一个产生几个值的方法。调用parent::generator_function() 时不会产生值。如何产生它们

class Papa
{
    public function generator_function()
    {
        yield 1;
        yield 2;
        yield 3;
    }
}

class Child extends Papa
{
    public function generator_function()
    {
        parent::generator_function();
        yield 4;
    }

}

$child = new Child();
foreach ($child->generator_function() as $value) {
    echo "$value\n";
};

【问题讨论】:

    标签: php overriding generator


    【解决方案1】:

    只需调用parent::generator_function() 即可为您提供一个生成器,您无需使用它。在生成器中,您可以delegate to another generator via yield from

    在 PHP 7 中,生成器委托允许您使用 yield from 关键字从另一个生成器、可遍历对象或数组中生成值。然后,外部生成器将产生内部生成器、对象或数组中的所有值,直到不再有效为止,之后将在外部生成器中继续执行。

    例如:

    class Child extends Papa
    {
        public function generator_function()
        {
            yield from parent::generator_function();
            yield 4;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      问题是您在父类中调用生成器,但这会将值产生给调用者 - 这是您在派生类中的方法。因此,您需要通过产生返回值将这些值传递给调用方法,例如...

      class Child extends Parent1
      {
          public function generator_function()
          {
              foreach ( parent::generator_function() as $out )  {
                  yield $out;
              }
      //         parent::generator_function();
              yield 4;
          }
      }
      

      【讨论】:

      • 有道理,但对我来说看起来很奇怪谢谢这是唯一的选择吗?
      • 可能需要等待,看看是否有其他答案出现。
      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多