PHP 5.6 Синтаксис генератора: Могут ли генераторы использоваться только в циклах foreach?

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


У меня есть класс, который генерирует имена файлов для скриншотов (селен):

class ScreenshotName
{

private $counter = 0;

public function screenshotNameIterator()
{
while(true) {
yield sprintf("screenshot-%s-%s.png", date("Y-m-d\\TH:i:s"), ++$this->counter);
}
}
}

Теперь мой вопрос: могу ли я использовать такой генератор в любом другом контексте, кроме цикла foreach? например

(new ScreenshotName())->screenshotNameIterator()->next()

для меня это всегда возвращает ноль, и если я отлаживаю, он никогда не входит в метод генератора. Также PHP документы не упоминают об этом.

Итак, мой вопрос: является Есть ли документированный способ использовать генератор в контексте, отличном от цикла for?

3

Решение

Есть документированный способ сделать это. На самом деле Generator реализует интерфейс итератора, как вы можете видеть на этом страница.

На самом деле foreach Ключевое слово работает только на итераторах. Так что, если вы можете использовать foreach на генераторе вы должны быть в состоянии позвонить next

Вот пример кода с использованием next вместо foreach :

<?php

function evenNumbers() {
for ($i = 0;; $i++) {
yield 2*$i;
}
}

$gen = evenNumbers();
$gen->next();
echo $gen->current();

?>
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]