一.介绍

 

 

二.简单例子

//包含yield的函数可以生成一个generator 对象,可以被foreach 遍历
function Generator()
{
for ($i = 0; $i < 3; $i++) {
echo "输出存在感1\n";
yield $i;
echo "输出存在感2\n";
}
}

echo "###返回对象1####\n";
var_dump(Generator());

echo "###返回对象####\n";

echo "###遍历一次情况####\n";

foreach (Generator() as $value) {

var_dump($value);
break; //只遍历一次的情况
}

echo "###遍历一次情况####\n";

echo "###一直遍历的情况####\n";

foreach (Generator() as $value) {

var_dump($value); //遍历多次

}

echo "###一直遍历的情况####\n";

/*
###返回对象1####
object(Generator)#1 (0) {
}
###返回对象####
###遍历一次情况####
输出存在感1
int(0)
###遍历一次情况####
###一直遍历的情况####
输出存在感1
int(0)
输出存在感2
输出存在感1
int(1)
输出存在感2
输出存在感1
int(2)
输出存在感2
###一直遍历的情况####
* */
1:在调用函数返回的时候,可以发现for里面的语句并没有执行
2:在遍历一次的时候,可以发现调用函数,却没有正常的for循环3次,只循环了一次
3:在遍历一次的情况时,"存在感2"竟然没有调用,在一直遍历的情况下才调用


三. yield 读取excel大文件数据
<?php
require '../vendor/autoload.php';
class Read{
public static function readLot(){
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load('person.xlsx'); //载入excel表格
$worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow();
$lines = $highestRow - 1;
if ($lines <= 0) {
echo 'Excel表格中没有数据';
die;
}
//获取excel内容
$data = self::yieldData($highestRow, $worksheet);
//遍历生成器[generate]
foreach ($data as $k => $v) {
//使用的时候就会读取一条出来,就不会把所有数据读取放在$data里面,造成内存不足,这就是yield的强大之处
var_dump($v).PHP_EOL;
echo $k;
echo '-----';
}

}
//包含yield关键字的函数会生成生成器generate
private static function yieldData($highestRow, $worksheet)
{
for ($row = 2; $row <= $highestRow; ++$row) {
$data[$row]['name'] = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
$data[$row]['remark'] = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
yield $data[$row];
}
}

}
Read::readLot();