PHP 生成器
2018-03-24 本文已影响0人
dongshixiao
在学习python时,发现有个yield(生成器)的概念,就特别留意了下。看书时发现PHP在5.5中已经增加了生成器的概念,用法和python中一样。写个demo给小伙伴们看看。
第一个例子是不使用生成器的例子:
创建一个100000个元素的数组
function makeRange($length)
{
$data = [];
for ($i=0; $i <$length ; $i++) {
$data[] = $i;
}
return $data;
}
$bigIntRang = makeRange(100000);
foreach ($bigIntRang as $i) {
echo $i.PHP_EOL;
}
上述方法会在内存中创建一个100000个int型的空间,内存占用会非常高,不建议使用。
使用生成器的demo:
function makeRange_1($length)
{
for ($i=0; $i <$length ; $i++) {
yield $i;
}
}
foreach (makeRange_1(100000) as $i) {
echo $i.PHP_EOL;
}
生成器 节省内存
使用生成器 每次调用时才会创建一个int型空间,非常节省内存。建议数据量大的时候使用。
再比如调用一个很大的数据块,如一个非常大的data.csv文件:
function getRows($file)
{
$handle = fopen($file, 'rb');
if ($handle === false){
throw new \Exception();
}
while (feof($handle) === false){
yield fgetcsv($handle);
}
fclose($handle);
}
foreach (getRows('data.csv') as $row){
print_r($row);
echo '<hr>';
}