php yield详解

 一.介绍

 

 

二.简单例子

//包含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();

posted on 2022-10-23 11:13  running-fly  阅读(2061)  评论(0编辑  收藏  举报

导航