The content introduced in this article is about the understanding of PHP Generator. It has a certain reference value. Now I share it with everyone. Friends in need can refer to it.
Reprinted and compiled from: Jifan, Fengxue Zhiyu, PHP manual
Generator
- ##Solved problems
- Generate implements the Iterator interface
<?php //生成器 Generator implements Iterator { //返回当前产生的值 public mixed current ( void ) //返回当前产生的键 public mixed key ( void ) //生成器继续执行 public void next ( void ) //重置迭代器,如果迭代已经开始了,这里会抛出一个异常。 public void rewind ( void ) //向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield public mixed send ( mixed $value ) //向生成器中抛入一个异常 public void throw ( Exception $exception ) //检查迭代器是否被关闭,已被关闭返回 FALSE,否则返回 TRUE public bool valid ( void ) //序列化回调 public void __wakeup ( void ) //返回generator函数的返回值,PHP version 7+ public mixed getReturn ( void ) } ?>
- Keyword yield
- Understand the execution process and available functions based on examples
<?php function xrang($start, $end, $step=1){ for($i=$start; $i<=$end; $i += $step) { yield $i; //yield关键字定义了中断点 } } //foreach (xrang(1, 10000) as $num) { // echo $num."\n"; //} $rang = xrang(1,2); var_dump($rang).PHP_EOL; //输出: object(Generator)#1 (0) {} var_dump($rang instanceof Iterator).PHP_EOL; //输出: bool(true) $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(6) "key: 0" $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(8) "valid: 1" $current = $rang->current(); var_dump("current: ".$current).PHP_EOL; //输出: string(10) "current: 1" $rang->next(); $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(6) "key: 1" $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(8) "valid: 1" $current = $rang->current(); var_dump("current: ".$current).PHP_EOL; //输出: string(10) "current: 2" $rang->next(); $key = $rang->key(); var_dump("key: ".$key).PHP_EOL; //输出: string(5) "key: " $valid = $rang->valid(); var_dump("valid: ".$valid).PHP_EOL; //输出: string(7) "valid: " //$rang->rewind(); //重置,目前看到的所有文档中,rewind()仅在第一次调用Generator的时候隐式执行。生成器开始迭代后调用会抛出Fatal error。 ?>2 Example 2
<?php function gen(){ echo "1111\n"; $ret = (yield 'yield1'); var_dump($ret); echo "2222\n"; $ret = (yield 'yield2'); var_dump($ret); //return; } $gen = gen(); var_dump($gen->current()).PHP_EOL; $a = $gen->send('ret1'); echo "66666\n"; var_dump($a).PHP_EOL; echo "77777\n"; var_dump($gen->valid()).PHP_EOL; $b = $gen->send('ret2'); var_dump($b).PHP_EOL; var_dump($gen->valid()).PHP_EOL; //1111 //string(6) "yield1" //string(4) "ret1" //2222 //66666 //string(6) "yield2" //77777 //bool(true) //string(4) "ret2" //NULL //bool(false) ?>
2.1 执行过程为:
1.首先调用gen(),进入函数输出1111,执行到第一个yield关键字所在的位置中断(此时yield表达式的值为定义的"yield1",使用current()获取当前表达式的值即得到string(6) "yield1")
2.调用send()方法向生成器中传入值"ret1"(传入生成器的值.这个值将会被作为生成器当前所在的 yield 的返回值),此时生成器从当前所在的yield表达式开始迭代,程序继续往下执行
3.遇到var_dump输出当前表达式的值"ret1",继续执行输出2222
4.继续执行,程序来到第二个yield中断点,此时表达式的值为定义值"yield2",因为调用的是send()方法,该方法返回当前所在的yield的值(current()方法值)。(查看send方法的官方文档)
5.$a获取到send方法的返回值即"yield2",继续执行输出"66666", $a, "77777"
6.输出当前生成器是否可用
7.继续执行,向生成器中传入值"ret2",生成器开始继续迭代。此时生成器位于第二个yield表达式,该表达式接受"ret2"作为返回值赋予变量$ret,打印得到string(4) "ret2"。
8.打印之后,$b == NULL,为NULL的原因因为未彻底理解清楚(疑问之处在于此时的send()方法到底有没有返回NULL),猜测可能有如下两个原因:
8.1 一者可能是因为生成器之后没有中断点,也没有返回值(返回值不被允许,或者说仅允许返回return; return;用于终止生成器的执行),$gen->send()方法根本就没有返回任何东西,导致$b == NULL
8.2 二者可能是$gen->send('ret2')传入值后,生成器迭代完本次的yield,隐式调用了next()和current(),又因为next()下面没有yield中断点使得current()返回NULL,导致send()返回值为NULL
8.3 根据上下文,二的可能性更大
2.2 关于send()方法
send()向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。
相关推荐:
The above is the detailed content of PHP generator Generator understanding. For more information, please follow other related articles on the PHP Chinese website!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Dreamweaver CS6
Visual web development tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool