、foreach()
は冒頭array
を取得し、それを反復処理するためにポインタを移動:
最初のフォームは、与えられた配列をループby array_expression各繰り返しで、現在の要素の値が$ valueに割り当てられ、内部配列ポインタが1つ進んでになります(次の反復では、次の要素が表示されます)。
重点鉱山
だからあなたの関数は一度だけ呼び出されます。この動作は、オペコードを見ると分かります。
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
命令です。
これはほとんどの場合、読みやすさの問題です。私の意見では、適切な名前の変数にメソッドの戻り値を代入するのが少し読みやすくなっています。アンクルボブは、しかし、クリーンコードで反対を述べている:
ループの制御変数は、通常、同じソースからこのかわいい機能のように、ループ文内で宣言されなければなりません。
public int countTestCases() {
int count= 0;
for (Test each : tests)
count += each.countTestCases();
return count;
}
さて、私はこのケースでは、最適化のことは知らないが、それは読みやすさとクリーンなコードに来るとき、私はそれだけで結果を保持する変数 '$のmodels'を使用するクリーナーだと確信しています。私は、この種のコードにいくつかのパフォーマンスの欠陥があるかどうかを知ることに興味があります。 – teeyo