$val-6ren">
gpt4 book ai didi

php - PHP 中的产量是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 11:39:59 27 4
gpt4 key购买 nike

我最近偶然发现了这段代码:

function xrange($min, $max) 
{
for ($i = $min; $i <= $max; $i++) {
yield $i;
}
}

我以前从未见过这个 yield 关键字。尝试运行我得到的代码

Parse error: syntax error, unexpected T_VARIABLE on line x

那么这个 yield 关键字是什么?它甚至是有效的PHP吗?如果是,我该如何使用它?

最佳答案

什么是yield

yield 关键字returns data from a generator function:

The heart of a generator function is the yield keyword. In its simplest form, a yield statement looks much like a return statement, except that instead of stopping execution of the function and returning, yield instead provides a value to the code looping over the generator and pauses execution of the generator function.

什么是生成器函数?

生成器函数实际上是编写 Iterator 的更紧凑和更有效的方法。 .它允许您定义一个函数(您的 xrange),该函数将计算并返回 您是 looping over it :

function xrange($min, $max) {
for ($i = $min; $i <= $max; $i++) {
yield $i;
}
}

[…]

foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}

这将创建以下输出:

0 => 1
1 => 2

9 => 10

你也可以通过使用

来控制 foreach中的 $key
yield $someKey => $someValue;

在生成器函数中,$someKey 是您希望出现的任何 $key$someValue$ 中的值值。在问题的例子中是 $i.

与普通函数有什么区别?

现在您可能想知道为什么我们不简单地使用 PHP 的原生 range function以实现该输出。你是对的。输出将是相同的。不同之处在于我们如何到达那里。

当我们使用 range PHP 时,会执行它,在内存中创建整个数字数组,然后 return 那个 整个数组foreach 循环,然后将遍历它并输出值。换句话说,foreach 将对数组本身进行操作。 range 函数和 foreach 只“交谈”一次。把它想象成在邮件中收到一个包裹。送货员会把包裹递给你然后离开。然后你打开整个包裹,取出里面的任何东西。

当我们使用生成器函数时,PHP 会单步执行该函数,直到它遇到结束或 yield 关键字。当它遇到 yield 时,它会将当时的值返回到外部循环。然后它回到生成器函数并从它产生的地方继续。由于您的 xrange 包含一个 for 循环,因此它将执行并产生直到达到 $max 为止。把它想象成 foreach 和生成器打乒乓球。

我为什么需要它?

显然,生成器可用于解决内存限制。根据您的环境,执行 range(1, 1000000) 将使您的脚本致命,而使用生成器同样可以正常工作。或者正如维基百科所说:

Because generators compute their yielded values only on demand, they are useful for representing sequences that would be expensive or impossible to compute at once. These include e.g. infinite sequences and live data streams.

生成器也应该很快。但请记住,当我们谈论快速时,我们通常会谈论非常少的数字。因此,在您现在运行并更改所有代码以使用生成器之前,请先做一个基准测试,看看它在哪里有意义。

生成器的另一个用例是异步协程。 yield 关键字不仅返回值,而且还接受它们。有关这方面的详细信息,请参阅下面链接的两篇优秀的博客文章。

我什么时候可以使用yield

PHP 5.5 中引入了生成器。尝试在该版本之前使用 yield 会导致各种解析错误,具体取决于关键字后面的代码。因此,如果您从该代码中收到解析错误,请更新您的 PHP。

来源和进一步阅读:

关于php - PHP 中的产量是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com