php下生成器的简单了解(代码解析)
来源:不言
发布时间:2018-10-10 15:58:35
阅读量:688
本篇文章给大家带来的内容是关于php下生成器的简单了解(代码解析),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
生成器类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # http:
Generator implements Iterator {
public mixed current ( void )
public mixed getReturn ( void )
public mixed key ( void )
public void next ( void )
public void rewind ( void )
public mixed send ( mixed $value )
public mixed throw ( Throwable $exception )
public bool valid ( void )
public void __wakeup ( void )
}
|
生成生成器
尝试实例化类
1 2 3 4 5 | $gen = new Generator();
# 我们发现不能直接手动实例化
# output
PHP Fatal error: Uncaught Error: The "Generator" class is reserved for internal use and cannot be manually instantiated in /web/www/sxx_admin3/src/cache/test/amphp/gen3.php:8
|
尝试function方式
1 2 3 4 5 6 7 8 9 10 11 | function gen( $max )
{
for ( $i =0; $i < $max ; $i ++) {
yield $i ;
}
}
$gen = gen(5);
# success
# 成功,我们只需要在普通函数方法里yield即可成了生成器
|
理解php的生成器
其实各语言都有生成器,比如python,go等
生成器迭代foreach
被代码将演示valid, getReturn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function gen( $max )
{
for ( $i =0; $i < $max ; $i ++) {
yield $i ;
}
return $max ;
}
$gen = gen(5);
foreach ( $gen as $val ) {
var_dump( $val );
}
if (version_compare(PHP_VERSION, '7.0.0' ) >= 0 && ! $gen ->valid()) {
var_dump( $gen ->getReturn());
}
|
带key值的生成器迭代foreach
迭代器返回值可以带key和value,类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function gen( $max )
{
for ( $i =0; $i < $max ; $i ++) {
yield $i => $i +1;
}
return $max ;
}
$gen = gen(5);
foreach ( $gen as $key => $val ) {
var_dump( $key . "=>" . $val );
}
# output
string(4) "0=>1"
string(4) "1=>2"
string(4) "2=>3"
string(4) "3=>4"
string(4) "4=>5"
|
生成器迭代手动迭代
本代码将演示rewind, next, send方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | function gen( $max )
{
for ( $i =0; $i < $max ; $i ++) {
$res = (yield $i );
var_dump( $res );
}
return $max ;
}
$gen = gen(10);
$gen -> rewind ();
var_dump( "1::" . $gen ->current());
$gen ->next();
var_dump( "2::" . $gen ->current());
$gen ->next();
var_dump( "3::" . $gen ->current());
$gen ->send(null);
var_dump( "4::" . $gen ->current());
$gen ->send(100);
var_dump( "5::" . $gen ->current());
if (version_compare(PHP_VERSION, '7.0.0' ) >= 0 && ! $gen ->valid()) {
var_dump( $gen ->getReturn());
}
# output:
string(4) "1::0"
NULL
string(4) "2::1"
NULL
string(4) "3::2"
NULL
string(4) "4::3"
int(100)
string(4) "5::4"
# 我们先不去理会gen里var_dump输出的NULL或int(100)
# 我们先去理解每次next后current可以获取到当前yield的值即可
|
尝试理解send输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | function gen( $max )
{
for ( $i =0; $i < $max ; $i ++) {
$res = (yield $i );
var_dump( $res );
}
return $max ;
}
$gen = gen(10);
var_dump( "1::" . $gen ->current());
$gen ->send(222);
var_dump( "2::" . $gen ->current());
$gen ->send(333);
var_dump( "3::" . $gen ->current());
$gen ->send(null);
var_dump( "4::" . $gen ->current());
# output:
string(4) "1::0"
int(222)
string(4) "2::1"
int(333)
string(4) "3::2"
int(444)
string(4) "4::3"
# send和next
# next() => current = yield值
# send(val) $rs = yield 表达式执行 = val;
# 在当前某个yield处时send,当前yield表达式处返回,如果没有变量接收,那么继续下一个yield处返回
$rs = (yield somethind_to_do(...) );
^ |-------------------|
| yield值
| |----------------------------|
| yield 表达式
yield表达式结果
# 执行顺序流程类似
$res = (yield 1);
var_dump( $res );
$res = (yield 2);
var_dump( $res );
$res = (yield 3);
var_dump( $res );
$res = (yield 4);
|
总结
初识我们只需要先理解next和send即可
next->让我们可以主动自动执行迭代器
send->可以让我们的迭代器实现双向通信,改变执行体流程顺序
后续我们会介绍使用场景和Co自动执行体等
以上就是php下生成器的简单了解(代码解析)的详细内容,更多请关注php中文网其它相关文章!