PHP生成器介绍
PHP 生成器提供了一种更简单的方法来实现简单的对象迭代,与定义类来实现接口相比,大大降低了性能开销和复杂性。
这个特性直到 PHP 5.5.0 才引入,所以被很多人忽视了。当我决心巩固自己的基本编程知识时,我通过阅读 PHP 官方手册发现了它。
生成器允许您在代码块中编写代码来迭代一组数据,而无需在内存中创建数组,这会超出您的内存限制或占用大量处理时间。相反,您可以编写一个生成器函数,就像编写一个普通的自定义函数一样,与仅返回一次的普通函数不同,生成器可以根据需要多次产生,以生成您需要迭代的值。
一个简单的例子是使用生成器重新实现 range() 函数。标准的 range() 函数需要在内存中生成一个包含其范围内每个值的数组,然后返回该数组,这样会得到多个大数组。例如调用 range(0, ) 会导致内存使用量超过 100MB。
如果使用生成器,则只需要足够的内存来创建对象并在内部跟踪生成器的当前状态,这占用不到 的内存。
优势
如果直接讲概念,大家可能还是会感到困惑,那么我们先讲一下优点,可能会引起你的兴趣。那么生成器到底有哪些优点呢?主要有以下几点:
生成器会对 PHP 应用程序的性能产生重大影响
PHP 代码运行时节省大量内存
更适合计算大量数据
那么,这些神奇的功能是如何实现的呢?
例子
在上面的例子中,使用循环来处理函数的返回值(“file.txt”)。
不管(“file.txt”)的返回值是什么,我们先来看看它的用法。下面是PHP官方的说法:
语法结构提供了一种简单的数组遍历方法。它只能应用于数组和对象。如果您尝试将其应用于其他数据类型的变量或未初始化的变量,则会发出错误消息。
可以看出(“file.txt”)返回的是一个数组或者对象。
现在回头看一下函数代码,这是一个没有返回值的函数,你会发现一个不常用的关键字“yield”。
收益率揭晓
上面的例子中,我们将(“file.txt”)看作一个生成器,而迭代生成器函数时,其实就是在迭代(“file.txt”)返回的一个类的对象。这个对象和普通的对象不同,它在被调用时会根据调用它的循环次数依次返回其中能生成的数据,直到最后一个yield输出一个值或者调用它的循环终止。使用的返回值始终只占用一次返回值所需的内存。
澄清一个概念
生成器yield关键字不返回任何值,它的专业术语叫输出值,只是生成一个值而已。
突出重点
生成器函数能够被调用输出的值的个数,是由生成器函数完全执行时产生的yield的个数决定的。实际应用中,我们调用生成器函数进行循环处理的代码,和操作数组的代码没什么区别。PHP生成器本身是为了防止特殊场景下生成的数组或对象过大,占用大量内存,设置了内存溢出。
解释
以下是来自PHP官网的定义,翻译水平有限,还请谅解。
当a第一次执行时,返回该类的一个对象,这个对象实现了接口,同样作为一个单向迭代器对象,还提供了可以操作生成器状态的方法,包括发送值、返回值等。实际开发应用
生成器在实际开发中有哪些应用呢?根据它的特点,它可以循环调用,并且调用之后会根据调用的次数返回它的值。
读取非常大的文件
PHP开发经常需要读取很大的文件,比如csv文件,文本文件,或者一些日志文件,如果这些文件非常大,比如5G,那么直接一次性将所有内容读入内存进行计算是不现实的。
这时生成器就派上用场了。我们来看一个简单的例子:读取文本文件。
欢迎讨论
我写自媒体的主要原因之一是为了赚钱养家,还有一个原因就是为了重新认识编程、PHP、开发。写过一次之后,知识自然就会储存在脑子里,对记忆很有帮助。小伙伴们不妨参与讨论,在讨论中加深记忆。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。