我在PHP中使用foreach
循环,类似于:
foreach ($class->getAttributes() as $attribute) {
// Work
}
关于效率,在$attributes = $class->getAttributes();
循环之外使用foreach
语句并迭代$attributes
变量是否更好?或者$class->getAttributes()
语句只在开头的foreach
声明中被调用一次?
(我知道在这种情况下这可能不是大效率问题,但我想知道这个和其他更大案例的原理)
谢谢,
史蒂夫
答案 0 :(得分:15)
在$class->getAttributes()
循环之外使用foreach
并使用临时变量,或者像你写的一样保留它不应该改变任何有关性能的内容:它仍然只会被评估一次
这是一个证明它的例子:
function get_array() {
echo 'function called !<br />';
return array(
'first' => 123,
'second' => 456,
'last' => 789,
);
}
foreach (get_array() as $key => $value) {
echo "$key : $value<br />";
}
我使用函数而不是类的方法来获得一个更短的例子,但原理与类+方法相同。
调用这部分代码会得到以下输出:
function called !
first : 123
second : 456
last : 789
即。 get_array()
函数仅在foreach
循环开始时调用一次。
答案 1 :(得分:2)
foreach
在内部复制:
注意:除非引用了数组,否则
foreach
将对指定数组的副本进行操作,而不是数组本身。 [...]
所以它对你的情况没有任何影响。 $class->getAttributes()
只被调用一次来检索数组。
答案 2 :(得分:1)
我没有测试过,但我认为做的是这样的事情:
$attributes = $class->getAttributes();
foreach($attributes as $attribute)
{
}
更具可读性,如果需要,可以在foreach结束后获取属性。
但是,在对您的问题做出更直接的回复时,getAttributes()
只会在任何一种情况下被调用一次。
答案 3 :(得分:1)
正如其他人所说,你的例子中的函数只被调用一次。
预评估可以产生影响的情况是循环。
$str = 'abcdefghijklmnop';
//strlen will be called on every iteration
for($i = 0; $i < strlen($str); $i++);
//strlen will only be called once
$len = strlen($str);
for($i = 0; $i < $len; $i++);