在foreach循环中使用函数调用

37 php

在foreach循环中使用函数调用是否存在关于效率的问题.例如:

foreach ($this->getValues() as $value) {
  //Do something with $value
}
Run Code Online (Sandbox Code Playgroud)

$values = $this->getValues();
foreach ($values as $value) {
  //Do something with $value
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,php是聪明的,只能在第一个例子中调用$ this-> getValues()一次,或者在每次迭代时调用它.如果它在每次迭代时调用它,那么它如何跟踪它当前所在的元素,

Wes*_*rch 37

这两者基本相同:

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

$values = $this->getValues();
foreach ($values as $value) {
  //
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是正确的,但我不确定你的意思是"断然".你为什么不测试它?在返回数组之前,让`getValues`记录一条消息或直接用echo输出内容,这样你就可以看到它被调用了多少次. (8认同)

tda*_*ers 19

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

请注意,情况与典型forwhile循环不同,这可能是您从中获得此概念的地方.例如,在以下代码中:

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

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

  • 当你说*所以第一种方法可能会带来额外的开销*我想你的意思是*第二种方法* (3认同)