覆盖类中的生成器方法

时间:2018-12-22 18:03:07

标签: php override generator

我在一个类中有一个产生两个值的方法。调用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";
};

2 个答案:

答案 0 :(得分:2)

简单地调用parent::generator_function()会为您提供一个生成器,而您却无所作为。在生成器中,您可以delegate to another generator via yield from

  

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

例如:

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

}

答案 1 :(得分:1)

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

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