2.9PHP语言的生成器(Generator)类

1.生成器函数声明

生成器函数声明就跟普通函数声明一样,区别在于:生成器函数体必须至少包含一个 yield,可包含也可不包含 return

yieldreturn 的区别在于:return 会立即终止函数的执行并返回值,而 yield 会向在生成器(Generator)类的对象上迭代的代码提供一个值,并暂停生成器函数的执行。

function 函数名(形参名) {
    //函数体
}
//yield返回null
yield;

//yield返回值
yield 表达式;

//yield返回键/值对
yield 键 => 值;

//yield通过另一个生成器函数、实现了Traversable接口的类的对象、数组返回值
yield from 表达式;

2.调用生成器函数

调用生成器函数就跟调用普通函数一样。

当一个生成器函数被调用时,一个生成器(Generator)类的对象会被返回。当迭代该对象时(例如,通过 foreach 循环),PHP 将在每次需要一个值时调用该对象的迭代方法,然后在该对象 yield 返回一个值时保存该对象的状态,以便在需要下一个值时恢复它。一旦没有更多的值要 yield 返回,那么生成器函数就停止执行。

3.示例

range() 函数需要在内存中生成一个数组以包含每一个在 range() 函数范围内的值,然后返回该数组,结果就是会产生一个很大的数组。比如,调用 range(0, 1000000) 将导致内存占用超过 100 MB。

作为一种替代方式,我们可以实现一个 xrange() 生成器函数,只需要足够的内存来创建生成器(Generator)类的对象并在内部跟踪生成器(Generator)类的对象的当前状态,这样只需要不到 1KB 的内存。

但是,生成器(Generator)类的对象也有缺点:生成器(Generator)类的对象是一个只能向前的迭代器,一旦迭代开始,就无法后退。这也意味着同一个生成器(Generator)类的对象不能被迭代多次,只能再次调用生成器函数重新构建生成器(Generator)类的对象。

function xrange($start, $limit, $step = 1) {
    if ($start <= $limit) {
        if ($step <= 0) {
            throw new LogicException('Step must be positive');
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Step must be negative');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

echo 'Single digit odd numbers from range():  ';
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}
echo "\n";

echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}

//输出
Single digit odd numbers from range():  1 3 5 7 9
Single digit odd numbers from xrange(): 1 3 5 7 9


原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/29218.html

(0)
上一篇 2023年7月8日
下一篇 2023年7月10日

相关推荐

  • 1.1PHP语言的标记(Tag)

    当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,而任何起始和结束标记之外的部分不会被 PHP 解析器处理,而是会被简单地原样输出。 例外地是当这部分处于条件语句中间时,此时 PHP 解释器会根据条件判断来决定哪些输出,哪些跳过。 以下示例中 PHP 将跳过条件语句未达成的段落,即使该…

    PHP语言教程 2023年6月1日
    0140
  • 1.7PHP语言的常量(Constant)

    1.常量声明 1.1define()函数声明方式 使用 define() 函数声明常量,值可以为任意表达式。 1.2const关键字声明方式 使用 const 关键字声明常量,值只可以为 标量类型(int, float, bool, string)表达式 或者 包含元素只为标量类型(int, flo…

    PHP语言教程 2023年6月7日
    0250
  • 2.8PHP类型之可调用(Callable)

    可调用(callable)类型表示回调函数。 1.回调函数声明 回调函数声明无需特殊的语法。 回调函数支持 普通函数、匿名函数、箭头函数、静态方法、实例方法、任何实现了 __invoke() 方法的类的对象。 2.传递回调函数 传递方式 语法 字符串 ” 数组 array() 或 [] 变量 $变量名 回调函数 传递…

    PHP语言教程 2023年7月8日
    0260

发表回复

登录后才能评论