2.11PHP类型之生成器(Generator)

1.生成器类与自定义类

生成器(Generator)类是PHP语言内置的类,与自定义类一样都实现了 Iterator 接口,提供对象迭代的实现方式。

1.1优势:性能更好

一个简单的例子就是使用生成器函数来重新实现 range() 函数。标准的 range() 函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组,结果就是会产生多个很大的数组。那会使你的内存达到上限,或者会占据可观的处理时间。比如,调用 range(0, 1000000) 将导致内存占用超过 100 MB。

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

1.2优势:代码量更少

生成器类与自定义类, 同样的功能,用生成器函数可以编写更少的代码,可读性也更强。

1.3劣势:只向前迭代

生成器类是一个只能向前的迭代器,意思是说,被迭代的对象只能按顺序迭代,不可以逆向迭代等其它迭代顺序。

2.生成器函数声明

生成器函数看起来像普通函数,不同的是,普通函数遇到 return 时会立即返回值并终止函数的执行,而 yield 会返回一个值给循环调用此生成器函数的代码并且只是暂停执行生成器函数,然后继续从暂停点执行直至循环结束。

任何包含 yield 的函数都是一个生成器函数。

2.1带参数的yield

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;
        }
    }
}

2.2带键值对参数的yield

yield $id => $fields;

2.3不带参数的yield

yield 可以在没有参数传入的情况下被调用来生成一个 null 值并配对一个自动的键名。

yield;

2.4yield from

生成器委托允许使用 yield from 从另外一个生成器、Traversable对象、array 生成值。

yield from 外部生成器

2.调用生成器函数

当调用生成器函数时,会返回一个 Generator 类的对象。

//注意下面range()和xrange()输出的结果是一样的
echo 'Single digit odd numbers from range():  ';
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}

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/20042.html

(0)
上一篇 2021年2月10日 20:16
下一篇 2021年2月12日 01:45

相关推荐

  • 1.11PHP语言的异常(Exception)语句

    1.throw语句 2.try-catch语句 3.try-finally语句 4.try-catch-finally语句 如果在 try 或 catch 块中包含 return 语句,finally 块仍将执行。此外,return 语句的返回值会在 finally 块执行后返回。此外,如果 finally 块也包含 …

    PHP语言教程 2021年1月11日
    06670
  • 2.8PHP类型之枚举(Enum)

    枚举(enum)本质是一个类(Class), 它的各种条目(case)是这个类的单例对象,既然条目是对象,那就意味着条目可以被用在对象可以被使用在的地方。 1.纯粹(Pure)枚举 如果条目仅仅为当前枚举的单例对象,条目没有关联数据,就称为“纯粹条目”(Pure Case)。仅包含纯粹条目的枚举,就称为“纯粹枚举“(P…

    PHP语言教程 2021年2月8日
    06680
  • 1.6PHP语言的变量(Variable)

    1.变量声明 变量在类中被称为属性(property)。 2.变量分类 2.1全局变量 名称 修饰符 全局变量 —————— 2.1成员变量 名称 修饰符 静态属性(类体内) 用static修饰 实例属性 —————— 2.2局部变量 名称 修饰符 静态变量(函数体内) 用static修饰 局部变量 —————— 参数…

    PHP语言教程 2021年1月6日
    05510

发表回复

登录后才能评论