LMLPHP后院

PHP 5.5 新特性关键字 yield技术

maybe yes 发表于 2015-07-07 23:39

PHP 5.5 增加了个新的关键字 yield,这个也是本人今天在看开源应用 tencent-php tsf 的源码的时候发现的,其中大量的使用到了 yield。

通俗一点的讲,yield 是 generator 发生器,配合迭代 iterator 使用。在函数迭代的某一步遇到 yield 语句时返回一个值,下次生成时从 yield 语句的地方继续运行,直到再次遇到 yield 再次返回值,这样就可以达到更好的迭代 iterate 的效果。

官方文档上有个例子讲到了将 range() 实现为生成器,当数据量很大的时候不会消耗太多内存,代码示例如下:

<?php
function xrange($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;
        }
    }
}
?>

yield 关键字语法返回生成器对象。当一个生成器函数第一次被调用的时候,会返回一个内部 Generator 类的对象。这个对象和一个只能向前的迭代器对象一样实现了 Iterator 接口。大部分 Generator 类中的方法拥有和 Iterator 接口一样的语义,但是生成器对象有一个特殊的方法: send()。

<?php
class Generator implements Iterator {
    public function rewind();     // 返回到迭代器的第一个元素。

    public function valid();      // 返回false如果迭代器已经关闭,否则返回true

    public function current();    // 返回当前yield值.

    public function key();        // 返回当前yield键名.

    public function next();       // 恢复生成器的执行。
    
    public function send($value); // 将传入的值作为yield表达式的结果并且恢复发生器的执行。

}
?>

yield 的应用场景,一般多用于循环体,比如数据库的 fetch 操作,这样可以减少内存的消耗,ZanPHP 框架就大量的这样使用。切莫滥用 yield 操作,滥用的结果性能会降低。

相关文章
2024-04-26 17:25:56 1714123556 0.008553