私は先進的な試験のためにPHPを勉強しています。実践テストでは、最初の反復は2番目の反復よりも優れていると言いました。なぜ私は理解していない。それらは両方とも配列の内容をちょうどうまく反復処理します。これら2つの配列の反復の違いは何ですか?
//まず1:
foreach($array as $key => &$val) { /* ... */ }
// 2つ目:
foreach($array as $key => $val) { /* ... */ }
私は先進的な試験のためにPHPを勉強しています。実践テストでは、最初の反復は2番目の反復よりも優れていると言いました。なぜ私は理解していない。それらは両方とも配列の内容をちょうどうまく反復処理します。これら2つの配列の反復の違いは何ですか?
//まず1:
foreach($array as $key => &$val) { /* ... */ }
// 2つ目:
foreach($array as $key => $val) { /* ... */ }
模擬試験は、最初の反復が第二よりも優れていると述べました。
これは最良のアドバイスではありません。彼らはさまざまな仕事のための異なるツールです。
&
は、コピーとは対照的に、変数を変数として扱うことを意味します。
変数参照がある場合は、Cのポインタと似ています。変数にアクセスすると、元の変数のメモリ位置にアクセスできるようになり、別の識別子で値を変更できるようになります。
// Some variable.
$a = 42;
// A reference to $a.
// & operator returns a reference.
$ref = &$a;
// Assignment of $ref.
$ref = "fourty-two";
// $a itself has changed, through
// the reference $ref.
var_dump($a); // "fourty-two"
CodePadの参考例。
foreach
の通常の動作は、関連するブロックでコピーを使用できるようにすることです。これは自由に割り当てを変更できることを意味し、配列メンバーには影響しません(クラスインスタンスなどの常に参照する変数の場合はそうではありません)。
CodePadのコピー例。
CodePadのクラスインスタンスの例。 foreach
内の参照を使用
は偶然後修飾および配列に影響を与えることができ、このような反復処理の最後の値にダングリング$val
参照として、いくつかの副作用を有します。
CodePadのぶら下がり参考例。 $val
に変更が$array
に保存されます> -は
最初の例は、$val
ため&
参照演算子を含みます。
これは例#2よりも "良い"ものではありません。
ええ、人をもっと混乱させる傾向があります:http://stackoverflow.com/questions/6287970/php-foreach-statement-by-reference-unexpected-behaviour-when-reusing-iterator –
[this ](http://stackoverflow.com/questions/10057671/how-foreach-actually-works)。 – BlitZ
どのような試験をしますか?私はこれがZCEから来たとは信じられません –