Переопределить метод генератора в классе - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть метод в классе, который дает пару значений.При вызове 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 голосов
/ 23 декабря 2018

Простой вызов parent::generator_function() дает вам генератор, с которым вы ничего не делаете.Внутри генератора вы можете делегировать другому генератору через yield from.

В PHP 7 делегирование генератора позволяет вам получать значения из другого генератора, объекта Traversable или массива с помощьюиспользуя yield из ключевого слова .Затем внешний генератор будет выдавать все значения из внутреннего генератора, объекта или массива до тех пор, пока они не станут недействительными, после чего выполнение будет продолжено во внешнем генераторе.

Например:

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

}
0 голосов
/ 22 декабря 2018

Проблема в том, что вы вызываете генератор в родительском классе, но это дает значения вызывающей стороне, которая является вашим методом в производном классе.Поэтому вам нужно будет передать эти значения вызывающему методу, возвращая возвращаемые значения, что-то вроде ...

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