相反for()
,其中每個指令在每次迭代評估,foreach()
得到array
在開始,然後移動指針來遍歷它:
第一種形式循環中給出的陣列上由array_expression。在每次迭代中,當前元素的值被分配給$值,並且內部數組指針被提前一個(所以在下一次迭代中,您將看到下一個元素)。
重點煤礦
所以你的函數被調用一次。你可以看到這個行爲看着操作碼。
Without assignment:
<?php
function find() {
return [1, 2, 3, 4, 5, 6, 7, 8];
}
foreach (find() as $n) {
echo $n.PHP_EOL;
}
操作碼:
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > NOP
7 1 INIT_FCALL 'find'
2 DO_FCALL 0 $1
3 > FE_RESET_R $2 $1, ->8
4 > > FE_FETCH_R $2, !0, ->8
8 5 > CONCAT ~3 !0, '%0A'
6 ECHO ~3
7 > JMP ->4
8 > FE_FREE $2
9 9 > RETURN 1
而且with assignment:
<?php
function find() {
return [1, 2, 3, 4, 5, 6, 7, 8];
}
$f = find();
foreach ($f as $n) {
echo $n.PHP_EOL;
}
操作碼:
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > NOP
6 1 INIT_FCALL 'find'
2 DO_FCALL 0 $2
3 ASSIGN !0, $2
7 4 > FE_RESET_R $4 !0, ->9
5 > > FE_FETCH_R $4, !1, ->9
8 6 > CONCAT ~5 !1, '%0A'
7 ECHO ~5
8 > JMP ->5
9 > FE_FREE $4
9 10 > RETURN 1
正如您所看到的,唯一的區別是ASSIGN
指令,即指定給$f
的指令。
所以這主要是一個可讀性問題。在我看來,使用合適的名稱將變量的返回賦值給一個變量會更具可讀性。 Bob大叔,但是,國家在清潔守則相反:
for循環控制變量通常應在循環語句中聲明,如從同一來源這個可愛的小功能。
public int countTestCases() {
int count= 0;
for (Test each : tests)
count += each.countTestCases();
return count;
}
好吧,我不知道在這種情況下優化,但是當涉及到可讀性和清晰的代碼,我敢肯定,這是清潔劑只使用一個變量'$ models'容納結果。我有興趣知道這種代碼是否有一些性能缺陷 – teeyo