note 123972 added to generator.send
| From: | anonymous at example dot com | Date: | Fri, 21 Jun 2019 10:38:01 +0000 |
| Subject: | note 123972 added to generator.send | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-211326@lists.php.net to get a copy of this message | ||
As of 7.3, the behavior of a generator in a foreach loop depends on whether or not it expects to
receive data. Relevant if you are experiencing "skips".
<?php
class X implements IteratorAggregate {
public function getIterator(){
yield from [1,2,3,4,5];
}
public function getGenerator(){
foreach ($this as $j => $each){
echo "getGenerator(): yielding: {$j} => {$each}\n";
$val = (yield $j => $each);
yield; // ignore foreach's next()
echo "getGenerator(): received: {$j} => {$val}\n";
}
}
}
$x = new X;
foreach ($x as $i => $val){
echo "getIterator(): {$i} => {$val}\n";
}
echo "\n";
$gen = $x->getGenerator();
foreach ($gen as $j => $val){
echo "getGenerator(): sending: {$j} => {$val}\n";
$gen->send($val);
}
?>
getIterator(): 0 => 1
getIterator(): 1 => 2
getIterator(): 2 => 3
getIterator(): 3 => 4
getIterator(): 4 => 5
getGenerator(): yielding: 0 => 1
getGenerator(): sending: 0 => 1
getGenerator(): received: 0 => 1
getGenerator(): yielding: 1 => 2
getGenerator(): sending: 1 => 2
getGenerator(): received: 1 => 2
getGenerator(): yielding: 2 => 3
getGenerator(): sending: 2 => 3
getGenerator(): received: 2 => 3
getGenerator(): yielding: 3 => 4
getGenerator(): sending: 3 => 4
getGenerator(): received: 3 => 4
getGenerator(): yielding: 4 => 5
getGenerator(): sending: 4 => 5
getGenerator(): received: 4 => 5
----
Server IP: 208.43.231.9
Probable Submitter: 82.199.157.34 (proxied: 73.41.41.12)
----
Manual Page -- http://php.net/manual/en/generator.send.php
Edit -- https://master.php.net/note/edit/123972
Del: integrated -- https://master.php.net/note/delete/123972/integrated
Del: useless -- https://master.php.net/note/delete/123972/useless
Del: bad code -- https://master.php.net/note/delete/123972/bad+code
Del: spam -- https://master.php.net/note/delete/123972/spam
Del: non-english -- https://master.php.net/note/delete/123972/non-english
Del: in docs -- https://master.php.net/note/delete/123972/in+docs
Del: other reasons-- https://master.php.net/note/delete/123972
Reject -- https://master.php.net/note/reject/123972
Search -- https://master.php.net/manage/user-notes.php