45

在 foreach 循环中使用函数调用在效率方面是否存在任何问题。例如:

foreach ($this->getValues() as $value) {
  //Do something with $value
}

相对

$values = $this->getValues();
foreach ($values as $value) {
  //Do something with $value
}

本质上,php 是否足够聪明,可以在第一个示例中只调用一次 $this->getValues(),还是在每次迭代时调用它。如果它在每次迭代中调用它,那么它如何跟踪它当前所在的元素,

4

2 回答 2

47

这两者本质上是一样的:

foreach ($this->getValues() as $value) {
 //
}

$values = $this->getValues();
foreach ($values as $value) {
  //
}

$this->getValues()只会运行一次,因为它不在循环本身内。如果您稍后需要再次使用 的返回值getValues,请继续将其分配给变量,这样您就不必再次调用该函数。如果没有,你真的不需要变量。

于 2012-06-17T19:28:03.917 回答
23

可能存在差异,但对于 99.9% 的实际案例来说,差异可以忽略不计。在任何一种情况下,PHP 都只会调用你的函数/方法一次。当您使用时,内部发生的事情foreach是 PHP 对 iteratee( 之前的部分as)进行一次评估,存储结果,然后循环遍历它,将当前元素放入as. 如果您自己将迭代对象写入局部变量,您实际上只是在重复 PHP 的工作,因此第一种方法可能会带来额外的开销,但还不足以担心。我会优化可读性:如果函数调用很短并且是自描述的,则内联它;如果它很复杂或晦涩难懂,请将其存储在描述性变量中。

请注意,典型的forwhile循环的情况有所不同,这可能是您得到这个概念的地方。例如,在以下代码中:

for ($number = 0; $number < $this->getNumberOfItems(); ++$number) {
    // do stuff...
}

...getNumberOfItems()每次迭代都会调用该方法。在这种情况下,预先计算它并将其存储在局部变量中是有意义的。

于 2012-06-17T19:34:50.947 回答