PHP生成器Generators的简单解析
内容导读
收集整理的这篇技术教程文章主要介绍了PHP生成器Generators的简单解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2527字,纯文字阅读大概需要4分钟。
内容图文
这篇文章给大家介绍的内容是关于PHP生成器Generators的简单解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。什么是生成器Generators
生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
一个简单的例子就是使用生成器来重新实现 range() 函数。 标准的 range() 函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组, 结果就是会产生多个很大的数组。 比如,调用 range(0, 10000) 将导致内存占用超过 4 MB。
例子代码:
<?php/** * Created by PhpStorm. * User: chenbotome@163.com * Date: 2018/7/30 * Time: 上午11:29 */$start = xdebug_memory_usage();$num = 10000;function rangeWithGenerators($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('Step must be +ve'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('Step must be -ve'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } }}if ($argc === 1) { $iterate = rangeWithGenerators(0, $num, 1); foreach ($iterate as $value){ echo $value . "n"; } //var_dump(iterator_to_array($iterate));}if ($argc === 2) { $test = range(0, $num, 1); foreach ($test as $value) { echo $value . "n"; }}$end = xdebug_memory_usage();echo sprintf("内存消耗量%sn", convert($end-$start));function convert($size){ $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];}
环境
PHP7.1
Xdebug
执行命令
php test.php 结果返回:内存消耗量416 b
php test.php range 结果返回:内存消耗量4 mb
测试结果论述
通过代码的执行,比较除了PHP标准函数rang()和自定义函数rangeWithGenerators()之间的异同。实现了同样的目的,却消耗着不同的内存,生成器的优点显而易见。
rangeWithGenerators()使用了生成器,而生成器的关键就是使用yield关键词,yield常见的使用涉及到foreach和for两个流程控制语句。rangeWithGenerators()中for循环yield变量$i(yield可理解为生成-值,如同return可理解为返回-值)。
rangeWithGenerators()函数返回的便是一个生成器Generators( 使用var_dump($iterate)查看其类型 )。
既然rangeWithGenerators()函数返回的是一个生成器,我们可以使用以下两种方式来使用:
foreach循环该Generators,本例子中则使用该方法读取Generators。
PHP标准函数iterator_to_array(),该函数将Generators转换为一个Array。
相关文章推荐:
PHP中json_encode的使用方法介绍
php如何使用curl接收POST地址即创建一个接口的方法
以上就是PHP生成器Generators的简单解析的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是为您收集整理的PHP生成器Generators的简单解析全部内容,希望文章能够帮你解决PHP生成器Generators的简单解析所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 lecms, classcms, fastadmin, pbootcms, phpcms, eyoucms, yzmcms, PHP, xunruicms, jizhicms, dedecms, wordpress, hkcms, yzncms, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。