PHP yield学习之生成器(Generator)

本文介绍PHP生成器的基本概念,包括其与迭代器的区别、如何使用yield关键字生成迭代值,以及生成器函数的运行机制和常见用法。通过具体示例说明生成器在内存管理上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成器类似于迭代器,但是又不一样。
生成器允许在foreach中写代码迭代一组数据而不需要在内存中创建一个数组。这样避免了因数组过大而达到内存上限,影响运行效率。生成器函数与普通函数一样,不同的是,普通函数一次返回所需要的值,而生成器可以根据需要yield多次,生成需要迭代的值。
生成器使用yield关键字生成迭代的值。
在这里插入图片描述
生成器方法
在这里插入图片描述

Generator implements Iterator { //返回当前产生的值
public mixed current ( void ) //返回当前产生的键
public mixed key ( void ) //生成器继续执行
public void next ( void ) //重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
public void rewind ( void ) //向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield
public mixed send ( mixed $value ) //向生成器中抛入一个异常
public void throw ( Exception $exception ) //检查迭代器是否被关闭,已被关闭返回 FALSE,否则返回 TRUE
public bool valid ( void ) //序列化回调
public void __wakeup ( void ) //返回generator函数的返回值,PHP version 7+
public mixed getReturn ( void )
}

yield的运行:
例一:
生成器函数
在这里插入图片描述
1、调用生成器函数,并没有使用foreach
在这里插入图片描述
在这里插入图片描述
跟普通函数不一样,单纯的调用生成器函数时,他并没有执行for循环。
2、只进行一次遍历:
在这里插入图片描述
结果:只遍历一次的情况下,普通函数中的for循环会循环5次,但是这里只进行了一次循环,并且在yield后面的代码没有执行。
在这里插入图片描述
例二:
写一个生成器函数
function create_range(){
while(1){
echo '第一个yield: ’ . yield . ‘
’;
echo '第二个yield: ’ . yield . ‘
’;
echo ‘随便输点啥
’;
}
echo ‘while结束了
’;
}
调用生成器函数
在这里插入图片描述
结果如下:生***成器不能使用 return***
在这里插入图片描述
去掉return再来看:
在这里插入图片描述
1、dump输出的是一个生成器对象,并没有执行while循环
2、没有像普通函数一样进入死循环
3、第一次使用send向生成器函数中传入一个值时,函数中的第一个yield关键字会接收这个值并返回迭代值,同时会停止继续执行(因为紧跟着的第二个yield关键字还未被迭代);当第二次使用send时,第二个yield关键字会接收该值并继续向下执行。因为他之后再没有yield关键字。函数中有两个yield关键字,所以每使用两次send会进行一次完整的循环。第三次使用send时,函数的第一个yield关键字会被新的参数迭代。
4、循环外的代码没有执行,while循环并没有阻塞调用后续代码
5、在循环中使用了break;循环外的代码才被执行
在这里插入图片描述
例三:yield赋值
对yield表达式进行赋值时,必须使用()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例四:在yield后面加上k=>k=>k=>v,可生成键值数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例五:生产函数前增加引用定义,可以引用生成值
在函数明前加 & 符号
在这里插入图片描述
遍历的时候同样使用 &
在这里插入图片描述
结果:每次遍历的时候,同样发会改变函数中对应变量的值。
在这里插入图片描述
yield总结:
yield是生成器函数的关键字
生成器函数调用时,返回的是生成器对象
yield作为表达式使用时,可将一个值加入生成器中遍历,遍历完会终端后续的语句运行,并且保持状态,下次遍历时会继续执行
使用send传入参数时,yield可作为变量接收参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值