百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 带你了解PHP中的Generator
分享文章到:

带你了解PHP中的Generator

发布时间:12/01 来源:未知 浏览: 关键词:
引荐:《PHP视频教程》

何为 Generator

从 PHP 5.5 开端,PHP 参加了一个新的特性,那就是 Generator,中文译为生成器。生成器可以简便地用来实现对象的迭代,让我们先从官方的一个小例子说起。

xrange

在 PHP 中,我们都知道,有一个函数叫做 range,用来生成一个等差数列的数组,然后我们可以用这个数组停止 foreach 的迭代。详细就想这样。

foreach (range(1, 100, 2) as $num) {
    echo $num . PHP_EOL;
}

这一段代码就会输出首项为 1,末项为 100,公差为 2 的等差数列。它的施行次序是这样的。第一,range(1, 100, 2) 会生成一个数组,里面存了上面那样的一个等差数列,之后在 foreach 中对这个数组停止迭代。

那么,这样就会显现一个问题,假如我要生成 100 万个数字呢?那我们就要占用上百兆内存。虽然此刻内存很廉价,但是我们也不克不及这么白费内存嘛。那么这时,我们的生成器就可以排上用处了。思考下面的代码。

function xrange($start, $limit, $step = 1) {
    while ($start <= $limit) {
        yield $start;
        $start += $step;
    }
}

foreach (xrange(1, 100, 2) as $num) {
    echo $num . PHP_EOL;
}

这段代码所的出来的结果,和前面的那段代码千篇一律,但是,它内部的道理是翻天覆地了。

我们方才说了,前面的代码,range 会生成一个数组,然后 foreach 来迭代这个数组,从而取出某一个值。但是这段代码呢,我们从新定义了一个 xrange 函数,在函数中,我们用了一个关键字 yield。我们都知道定义一个函数,但愿它返回一个值得时候,用 return 来返回。那么这个 yield 呢,也可以返回一个值,但是,它和 return 是天壤之别的。

使用 yield 关键字,可以让函数在运转的时候,中止,同时会留存整个函数的上下文,返回一个 Generator 类型的对象。在施行对象的 next 办法时,会从新加载中止时的上下文,连续运转,直到显现下一个 yield 为止,假如后面没有再显现 yield,那么就认为整个生成器完毕了。

这样,我们上面的函数调取可以等价地写成这样。

$nums = xrange(1, 100, 2);
while ($nums->valid()) {
    echo $nums->current() . "\n";
    $nums->next();
}

在这里,$num 是一个 Generator 的对象。我们在这里看到三个办法,validcurrentnext。当我们函数施行完了,后面没有 yield 中止了,那么我们在 xrange 函数就施行完了,那么 valid 办法就会变成 false。而 current 呢,会返回当前 yield 后面的值,这是,生成器的函数会中止。那么在调取 next 办法之后,函数会连续施行,直到下一个 yield 显现,或者函数完毕。

好了,到这里,我们看到了通过 yield 来“生成”一个值并返回。其实,yield 其实也可以这么写 $ret = yield;。同返回值一样,这里是将一个值在连续施行函数的时候,传值进函数,可以通过 Generator::send($value) 来使用。例如。

function sum()
{
    $ret = yield;
    echo $ret . PHP_EOL;
}

$sum = sum();
$sum->send('I am from outside.');

这样,程序就会打印出 send 办法传进去的字符串了。在 yield 的两边可以同时有调取。

function xrange($start, $limit, $step = 1) {
    while ($start <= $limit) {
        $ret = yield $start;
        $start += $step;
        echo $ret . PHP_EOL;
    }
}

$nums = xrange(1, 100, 2);
while ($nums->valid()) {
    echo $nums->current() . "\n";
    $nums->send($nums->current() + 1);
}

而像这样的使用,send() 可以返回下一个 yield 的返回。

其它的 Generator 办法

Generator::key()

关于 yield,我们可以这样使用 yield $id => $value,这是,我们可以通过 key 办法来猎取 $id,而 current 办法返回的是 $value

Generator::rewind()

这个办法,可以帮我们让生成重视新开端施行并留存上下文,同时呢,会返回第一个 yield 返回的内容。在第一次施行 send 办法的时候,rewind 会被隐式调取。

Generator::throw()

这个办法,向生成器中,抛送一个非常。

跋文

yield 作为 PHP 5.5 的新特性,让我们用了新的办法来高效地迭代数据。同时,我们还可以使用 yield 来实现协程。

以上就是带你懂得PHP中的Generator的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板