yield关键字用于定义生成器函数。生成器函数可以一次生成一个值,并在每次生成值后暂停其执行,直到请求下一个值。这使得生成器可以有效地处理大量数据或无限数据流
不使用yield | 使用yield | |
执行方式 | 函数会立即执行,并一次性返回所有结果。函数执行过程中可能占用较多的内存 | 函数不会立即执行完毕,而是返回一个对象。每次调用对象的迭代器方法时,函数才会继续执行一段代码,并生成一个值,然后暂停执行,等待下一次迭代请求 |
返回结果 | 函数会返回一个数组、字符串、对象等值,包含所有生成的结果 | 函数返回一个对象,通过迭代对象可以逐个获取生成的值。不会一次性生成所有结果,只会按需生成。 使用yield关键字可以实现按需生成值,避免一次性生成所有结果,从而节省内存并提高性能 |
速度相差 | 下面案例 0.0246617794秒 | 下面案例 0.0000009537秒 |
1、不使用yield
<?php
function getNumbers() {
$numbers = [];
for ($i = 1; $i <= 1000000; $i++) {
$numbers[] = $i;
}
return $numbers;
}
$start = microtime(true); // 记录开始时间
$numbers = getNumbers();
$end = microtime(true); // 记录结束时间
$time2 = $end - $start; // 计算运行时间
echo "不使用yield: \n运行时间: " . $time2. "秒\n";
2、使用yield
function generateNumbers() {
for ($i = 1; $i <= 1000000; $i++) {
yield $i;
}
}
$start = microtime(true); // 记录开始时间
$generator = generateNumbers();
$end = microtime(true); // 记录结束时间
$time1 =number_format($end - $start, 10); // 计算运行时间
echo "使用yield: \n运行时间: " . $time1 . "秒\n";
使用yield的函数必须使用迭代器方法(如foreach循环)来遍历生成的值,否则函数中的代码不会被执行。