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();