Generator syntax

A generator function looks just like a normal function, except that insteadof returning a value, a generator yields as many values as it needs to. 

When a generator function is called, it returns an object that can beiterated over. When you iterate over that object (for instance, via a foreach loop), PHP will call the generator function each time it needs avalue, then saves the state of the generator when the generator yields avalue so that it can be resumed when the next value is required. 

Once there are no more values to be yielded, then the generator functioncan simply exit, and the calling code continues just as if an array has runout of values. 

Note: 

A generator cannot return a value: doing so will result in a compileerror. An empty return statement is valid syntax withina generator and it will terminate the generator. 

yield keyword

The heart of a generator function is the yield keyword.In its simplest form, a yield statement looks much like a returnstatement, except that instead of stopping execution of the function andreturning, yield instead provides a value to the code looping over thegenerator and pauses execution of the generator function. 

Example #1 A simple example of yielding values

<?php

function gen_one_to_three() {

    for ($i = 1; $i <= 3; $i++) {

        // Note that $i is preserved between yields.

        yield $i;

    }

}

$generator = gen_one_to_three();

foreach ($generator as $value) {

    echo "$value\n";

}

?>  

以上例程会输出:

1

2

3

Note: 

Internally, sequential integer keys will be paired with the yieldedvalues, just as with a non-associative array. 

Caution 

If you use yield in an expression context (for example, on the right handside of an assignment), you must surround the yield statement withparentheses. For example, this is valid: 

 $data = (yield $value); 

But this is not, and will result in a parse error: 

 $data = yield $value; 

This syntax may be used in conjunction with the send() method onGenerator objects. 

Yielding values with keys

PHP also supports associative arrays, and generators are no different. Inaddition to yielding simple values, as shown above, you can also yield akey at the same time. 

The syntax for yielding a key/value pair is very similar to that used todefine an associative array, as shown below. 

Example #2 Yielding a key/value pair

<?php

/* The input is semi-colon separated fields, with the first

 * field being an ID to use as a key. */

$input = <<<'EOF'

1;PHP;Likes dollar signs

2;Python;Likes whitespace

3;Ruby;Likes blocks

EOF;

function input_parser($input) {

    foreach (explode("\n", $input) as $line) {

        $fields = explode(';', $line);

        $id = array_shift($fields);

        yield $id => $fields;

    }

}

foreach (input_parser($input) as $id => $fields) {

    echo "$id:\n";

    echo "    $fields[0]\n";

    echo "    $fields[1]\n";

}

?>  

以上例程会输出:

1:

    PHP

    Likes dollar signs

2:

    Python

    Likes whitespace

3:

    Ruby

    Likes blocks

Caution 

As with the simple value yields shown earlier, yielding a key/value pairin an expression context requires the yield statement to beparenthesised: 

 $data = (yield $key => $value); 

Yielding null values

Yield can be called without an argument to yield a NULL value with anautomatic key. 

Example #3 Yielding NULLs

<?php

function gen_three_nulls() {

    foreach (range(1, 3) as $i) {

        yield;

    }

}

var_dump(iterator_to_array(gen_three_nulls()));

?>  

以上例程会输出:

array(3) {

  [0]=>

  NULL

  [1]=>

  NULL

  [2]=>

  NULL

}

Yielding by reference

Generator functions are able to yield values by reference as well as byvalue. This is done in the same way as returning references from functions:by prepending an ampersand to the function name. 

Example #4 Yielding values by reference

<?php

function &gen_reference() {

    $value = 3;

    while ($value > 0) {

        yield $value;

    }

}

/* Note that we can change $number within the loop, and

 * because the generator is yielding references, $value

 * within gen_reference() changes. */

foreach (gen_reference() as &$number) {

    echo (--$number).'... ';

}

?>  

以上例程会输出:

2... 1... 0... 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

热门专题

云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学
云南综合高中|云南综合高中
云南综合高中
安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
卓越综合高中|卓越综合高中
卓越综合高中
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部