php 生成器 教程,PHP生成器Generators的简单解析

这篇文章给大家介绍的内容是关于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("内存消耗量%s\n", 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。

相关文章推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值