Я знаю, что это может быть очень легко архивировано без генераторов, однако я хочу лучше понять генераторы. Поэтому, пожалуйста, не предлагайте использовать что-то еще.
У меня есть класс, который генерирует имена файлов для скриншотов (селен):
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?
Есть документированный способ сделать это. На самом деле Generator реализует интерфейс итератора, как вы можете видеть на этом страница.
На самом деле foreach
Ключевое слово работает только на итераторах. Так что, если вы можете использовать foreach
на генераторе вы должны быть в состоянии позвонить next
Вот пример кода с использованием next
вместо foreach
:
<?php
function evenNumbers() {
for ($i = 0;; $i++) {
yield 2*$i;
}
}
$gen = evenNumbers();
$gen->next();
echo $gen->current();
?>
Других решений пока нет …