International PHP Conference 2015

生成器 对象

当一个生成器函数第一次被调用的时候,会返回一个内部Generator类的对象。这个对象和一个只能向前的迭代器对象一样实现了Iterator接口。

大部分 Generator类中的方法拥有和Iterator接口一样的语义,但是生成器对象有一个特殊的方法: send()

Caution

Generator不能通过new操作来实例化.

Example #1 Generator

<?php
class Generator implements Iterator {
    public function 
rewind();          // 返回到迭代器的第一个元素。

    
public function valid();           // 返回false如果迭代器已经关闭,否则返回true

    
public function current();         // 返回当前yield值.

    
public function key();             // 返回当前yield键名.

    
public function next();            // 恢复生成器的执行。
    
    
public function send($value);      // 将传入的值作为yield表达式的结果并且恢复发生器的执行。

}
?>

Generator::send()

Generator::send() allows values to be injected into generator functions while iterating over them. The injected value will be returned from the yield statement and can then be used like any other variable within the generator function.

Example #2 Using Generator::send() to inject values

<?php
function printer() {
    while (
true) {
        
$string yield;
        echo 
$string;
    }
}

$printer printer();
$printer->send('Hello world!');
?>

以上例程会输出:

Hello world!
add a note add a note

User Contributed Notes 1 note

up
-43
dejiakala at gmail dot com
10 months ago
<?php

function sayHello($people) {
  foreach(
$people as $person) {
   
yield "hello " . $person;
  }
}

var_dump(sayHello(array('foo', 'bar', 'baz')));

?>

Output:

class Generator#1 (0) { 
}
To Top