Edit report at https://bugs.php.net/bug.php?id=65235&edit=1

 ID:                 65235
 Comment by:         shooric_ at mail dot ru
 Reported by:        shooric_ at mail dot ru
 Summary:            Unexpected behavior of the "yield"
 Status:             Not a bug
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Linux3.2.0-49
 PHP Version:        5.5.0
 Block user comment: N
 Private report:     N

 New Comment:

Ок, thanks


Previous Comments:
------------------------------------------------------------------------
[2013-07-10 14:31:25] ni...@php.net

A generator will only run as far as you run it - that's the whole point of it. 
If you want to ensure that some piece of code is always run, even if you don't 
consume the generator to the end, you can use a finally block:

function file_line_iterator($filename) {
    $h = fopen($filename, 'r');
    try {
        while (false !== $line = fgets($h)) {
            yield $line;
        }
    } finally {
        fclose($h);
    }
}

In your particular case this is not necessary as PHP will automatically close 
the file when the generator is destroyed.

------------------------------------------------------------------------
[2013-07-10 14:25:31] shooric_ at mail dot ru

Description:
------------
When you interrupt iterations on "yield" generator via "break" instruction, 
generator function does not work out until the end of.

Test script:
---------------
<?php
$filename = '111111.txt';
$h = fopen($filename, 'w+');
for($i = 0; $i < 7; $i++) {
    echo 'write: ' . $i . PHP_EOL;
    fwrite($h, $i . PHP_EOL);
}
fclose($h);
function file_line_iterator($filename) {
    echo 'open file' . PHP_EOL;
    $h = fopen($filename, 'r');
    while(false !== $line = fgets($h)) {
        echo 'yield: ' .  $line;
        yield $line;
    }
    echo 'close file' . PHP_EOL;
    fclose($h);
}
$k = 0;
foreach(file_line_iterator($filename) as $k => $v) {
    echo 'iterate: ' . $v;
    if(++$k > 4) {
        break;
    }
}

echo 'exit' . PHP_EOL;
exit;

Expected result:
----------------
write: 0
write: 1
write: 2
write: 3
write: 4
write: 5
write: 6
open file
yield: 0
iterate: 0
yield: 1
iterate: 1
yield: 2
iterate: 2
yield: 3
iterate: 3
yield: 4
iterate: 4

* close file

exit


Actual result:
--------------
write: 0
write: 1
write: 2
write: 3
write: 4
write: 5
write: 6
open file
yield: 0
iterate: 0
yield: 1
iterate: 1
yield: 2
iterate: 2
yield: 3
iterate: 3
yield: 4
iterate: 4
exit



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=65235&edit=1

Reply via email to