PHP性能优化利器:生成器 yield理解

发布于:2020-01-20 15:39:41

如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生。但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。

function createRange($number){    for($i=0;$i<$number;$i++){
        yield time();
    }
}
$result = createRange(10);
 // 这里调用上面我们创建的函数foreach($result as $value){    
 sleep(1);    
 echo $value.'<br />';
}


46f0bf92001310779d1d1381aba45d22.png




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


<?php
function count_to_ten() {
    
yield 1;
    
yield 2;
    
yield from [34];
    
yield from new ArrayIterator([56]);
    
yield from seven_eight();
    return 
yield from nine_ten();
}

function 
seven_eight() {
    
yield 7;
    
yield from eight();
}

function 
eight() {
    
yield 8;
}

function 
nine_ten() {
    
yield 9;
    return 
10;
}

$gen count_to_ten();
foreach (
$gen as $num) {
    echo 
"$num ";
}
echo 
$gen->getReturn();
?>

The above example will output:

1 2 3 4 5 6 7 8 9 10




<?php
//Example of class implementing IteratorAggregate using generator

class ValueCollection implements IteratorAggregate
{
    private 
$items = array();
   
    public function 
addValue($item)
    {
        
$this->items[] = $item;
        return 
$this;
    }
   
    public function 
getIterator()
    {
        foreach (
$this->items as $item) {
            yield 
$item;
        }
    }
}

//Initializes a collection
$collection = new ValueCollection();
$collection
        
->addValue('A string')
        ->
addValue(new stdClass())
        ->
addValue(NULL);

foreach (
$collection as $item) {
    
var_dump($item);
}


参考网址

https://www.php.net/manual/en/language.generators.syntax.php



阅读 439+

一片空白

父爱如山,不善表达。回想十多年前,总记得父亲有个宽厚的肩膀,小小的自己跨坐在上面,越过人山人海去看更广阔的天空,那个时候期望自己有一双翅膀,能够像鸟儿一样飞得高,看得远。虽然父亲有时会和自己开玩笑,但在做错事的时候会受到严厉的训斥。父亲有双粗糙的大手掌。