PHP 生成器类
简介
使用循环结构(例如 **foreach**)遍历大型数据集合需要大量的内存和相当的处理时间。使用 **生成器**,可以迭代数据集而无需这些开销。生成器函数类似于普通函数。但是,生成器不使用函数中的 return 语句,而是使用 **yield** 关键字重复执行,以便提供要迭代的值。
yield 关键字是生成器机制的核心。尽管它的用法看起来类似于 return,但它不会停止函数的执行。它提供下一个要迭代的值并暂停函数的执行。
语法
Generator implements Iterator {
/* Methods */
public current ( void ) : mixed
public getReturn ( void ) : mixed
public key ( void ) : mixed
public next ( void ) : void
public rewind ( void ) : void
public send ( mixed $value ) : mixed
public throw ( Throwable $exception ) : mixed
public valid ( void ) : bool
public __wakeup ( void ) : void
}方法
public Generator::current ( void ) − mixed — 获取产生的值
public Generator::getReturn ( void ) : mixed — 获取生成器的返回值。
public Generator::key ( void ) − mixed — 获取产生的值的键。
public Generator::next ( void ) − void — 恢复生成器的执行。与使用 NULL 作为参数调用 Generator::send() 的效果相同。
public Generator::rewind ( void ) − void — 倒回迭代器。如果迭代已经开始,这将抛出异常。
public Generator::send ( mixed $value ) : mixed — 将给定值发送到生成器作为当前 yield 表达式的结果,并恢复生成器。
public Generator::throw ( Throwable $exception ) − mixed — 将异常抛入生成器并恢复生成器的执行。
public Generator::valid ( void ) − bool — 检查迭代器是否已关闭
public Generator::__wakeup ( void ) − void — 抛出异常,因为生成器无法序列化。
Generator 类实现了 Iterator 接口。Generator 对象不能通过 new 实例化。任何包含 yield 关键字的用户定义函数都会创建 Generator 类的对象。
生成器示例
由于生成器实现了 Iterator 接口,因此可以使用 foreach 循环遍历产生的值。
<?php
function squaregenerator(){
for ($i=1; $i<=5; $i++){
yield $i*$i;
}
}
$gen=squaregenerator();
foreach ($gen as $val){
echo $val . " ";
}
?>输出
以上程序显示以下输出
1 4 9 16 25
以下示例使用生成器类的 current() 和 next() 方法遍历产生的值。使用 valid() 方法检查循环条件。
示例
<?php
function squaregenerator(){
for ($i=1; $i<=5; $i++){
yield $i*$i;
}
}
$gen=squaregenerator();
while ( $gen->valid() ){
echo "key: " . $gen->key(). " value: ". $gen->current() . "
";
$gen->next();
}
?>输出
以上程序显示以下输出
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP