php5.5新特性之yield理解

今天,在阅读别人代码时,其中出现了一个陌生的关键字yield,想一探究竟,于是找到:http://php.net/manual/zh/language.generators.overview.php

yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。

yield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组。

使用示例:

/**
 * 计算平方数列
 * @param $start
 * @param $stop
 * @return Generator
 */
function squares($start, $stop) {
    if ($start < $stop) {
        for ($i = $start; $i <= $stop; $i++) {
            yield $i => $i * $i;
        }
    }
    else {
        for ($i = $start; $i >= $stop; $i--) {
            yield $i => $i * $i; //迭代生成数组: 键=》值
        }
    }
}
foreach (squares(3, 15) as $n => $square) {
    echo $n . ‘squared is‘ . $square . ‘<br>‘;
}
输出:
    3 squared is 9
    4 squared is 16
    5 squared is 25
    ...

示例2:

//对某一数组进行加权处理
$numbers = array(‘nike‘ => 200, ‘jordan‘ => 500, ‘adiads‘ => 800);

//通常方法,如果是百万级别的访问量,这种方法会占用极大内存
function rand_weight($numbers)
{
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        $distribution[$number] = $total;
    }
    $rand = mt_rand(0, $total-1);

    foreach ($distribution as $num => $weight) {
        if ($rand < $weight) return $num;
    }
}

//改用yield生成器
function mt_rand_weight($numbers) {
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        yield $number => $total;
    }
}

function mt_rand_generator($numbers)
{
    $total = array_sum($numbers);
    $rand = mt_rand(0, $total -1);
    foreach (mt_rand_weight($numbers) as $num => $weight) {
        if ($rand < $weight) return $num;
    }
}
时间: 2024-10-19 05:17:43

php5.5新特性之yield理解的相关文章

php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的

1.PHP 5.3中的新特性 1.1 PHP 5.3中的新特性 1.1.1. 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符为反斜杆\. select.php [php] view plaincopyprint? <?php namespace Zend\Db\Table; class Select {}这样即使其它命名空间下存在名为Select的类,程序在调用时也不会产生冲突.代

PHP5.3, PHP5.4, PHP5.5新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了! 所以整理了一下 一些特性,有可能不全,待添加 PHP 5.3中的新特性 一.PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anonymous函数 5. 新增两个魔术方法__callStatic()和__invoke() 6.

Php5.5新特性 Generators详解

在**PHP5.5.0**版本中,新增了生成器*(Generators)*特性,用于简化实现迭代器接口*(Iterator)*创建简单的迭代器的复杂性. 通过生成器,我们可以轻松的使用foreach迭代一系列的数据,而不需要事先在内存中构建要被迭代的对象,大大减少了内存开销. 当生成器函数被调用的时候,它会返回一个可迭代的对象,当对该对象进行迭代的时候,PHP将会在需要的时候调用生成器函数,并且在生成器使用新增的关键字yield产生一个新的值的时候,保存迭代器内部的状态.迭代器没有新的值需要产生

PHP5.4新特性之上传进度支持Upload progress

在PHP5.4版本当中给我们提供了好用的特性,上传进度的支持,我们可以配合Ajax动态获取SESSION当中的上传进度: 在使用这一特性之前,需要现在php.ini文件当中进行相应的设置: 1 2 3 4 5 6 session.upload_progress.enabled[ = On] :                         是否启用上传进度报告(默认开启) session.upload_progress.cleanup[ = Off] :                    

Java8 的一些新特性的学习理解

近期在学习队列相关的一些知识,在学习过程中发现Iterable<T>接口中新增了两个新的方法,出于好奇,就想知道这是什么东东,干什么用的.俗话说:实践出真知,所以就有了以下反复的测试. 先看下新增的这两个方法: 1 default void forEach(Consumer<? super T> action) { 2 Objects.requireNonNull(action); 3 for (T t : this) { 4 action.accept(t); 5 } 6 } 1

php新特性--持续更新

命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类名依赖于目录(虽然命名空间之后规范要求也要和目录一样)导致类名特别特别长,如:Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query. 命名空间把代码放到一个逻辑上的空间中,可以和其他开发者编写的代码一起使用,是现代php生态系统的基础.详细参考p

面向对象第八天 -----新特性Trait

81.Trait php5.4 新特性 2.1 Trait的概述 Trait 是 PHP5.4 中的新特性,是 PHP 多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是 为了解决这个问题. 2.2 Trait的简单使用 格式:: trait 名字{ } 特点: ① 不能被实例化 ② 在类中use引入来实现其价值 2.3 多个Trait的引用 use A,B 2.4 Trait之间的嵌套 一个trait 可以由多个 trait

C++ 11新特性解析——《深入理解C++ 11:C++11新特性解析和应用》读书笔记

因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出这篇读书笔记的基础.C++作为踏入编程的最初语言,一直充满感情,而C++11作为新标准虽然推出一段时间了,却因为总总原因直到现在才去开始真正了解,不过一句话回荡在脑中:当你认为为时已晚的时候,恰恰是最早的时候!从C++98到C++11, C++11标准经历了10几年的沉淀,以全新的姿态迎接新的挑战,长话短说,

深入理解JVM内幕:从基本结构到Java 7新特性

转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境)上的.JRE中最重要的部分是Java虚拟机(JVM),JVM 负责分析和执行Java字节码.Java开发人员并不需要去关心JVM是如何运行的.在没有深入理解JVM的情况下,许多开发者已经开发出了非常多的优秀 的应用以及Java类库.不过,如果你了解JVM的话,你会更加了解Java的,并且你会轻松解