在foreach循环中使用函数调用是否存在关于效率的问题。例如:
foreach ($this->getValues() as $value) {
//Do something with $value
}
与
$values = $this->getValues();
foreach ($values as $value) {
//Do something with $value
}
基本上,php非常聪明,只能在第一个示例中调用$ this-> getValues()一次,或者在每次迭代时调用它。如果它在每次迭代时调用它,那么它如何跟踪它当前所在的元素,
答案 0 :(得分:34)
这两者基本相同:
foreach ($this->getValues() as $value) {
//
}
$values = $this->getValues();
foreach ($values as $value) {
//
}
$this->getValues()
只运行一次,因为它不在循环内部。如果您需要稍后再次使用getValues
的返回值,请继续将其分配给变量,这样您就不必再次调用该函数。如果没有,你真的不需要变量。
答案 1 :(得分:16)
可能存在差异,但对于99.9%的实际案例,它可以忽略不计。在任何一种情况下,PHP都只会调用您的函数/方法一次。使用foreach
时内部发生的事情是PHP评估iteratee(as
之前的部分)一次,存储结果,然后循环遍历它,将当前元素放入后面给出的局部变量中as
。如果您自己将iteratee写入本地变量,那么您实际上只是复制了PHP的工作量,因此第一种方法可能会带来额外的开销,但这并不足以让人担心。我会优化可读性:如果函数调用很短并且自我描述,则内联它;如果它复杂或模糊,请将其存储在描述性变量中。
请注意,情况与典型的for
和while
循环不同,这可能是您从中获得此概念的地方。例如,在以下代码中:
for ($number = 0; $number < $this->getNumberOfItems(); ++$number) {
// do stuff...
}
...每次迭代都会调用getNumberOfItems()
方法。在这种情况下,预先计算并将其存储在局部变量中是有意义的。