1

今日、私は PHP の公式マニュアル ページから記事What Reference Doを読んでいて、次のコードを見つけました。

<?php
$arr = array(1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
/* $a == 2, $arr == array(2) */

そして、このコードについてのマニュアルの説明:

配列内の参照は潜在的に危険です。右側の参照を使用して通常の (参照によるではない) 代入を実行しても、左側は参照に変わりませんが、配列内の参照はこれらの通常の代入で保持されます。これは、配列が値渡しされる関数呼び出しにも適用されます。

コードの実行後に $a と $arr が 2 になる理由を誰か説明してもらえますか?

4

2 に答える 2

1

を実行するvar_dump($arr);と、問題が表示されます。$arr[0]があります&int type

  • これは$arr[0]、値への参照になることを意味します。
  • そして、$arr配列は実際には最初の値として参照を持ちます。
  • 配列を複製すると、最初の要素が参照のままであり、参照された値を変更するため、参照は引き継がれます。

それは配列のことです。本当に奇妙に思えますが、一度理解すれば、それは理にかなっています...PHPが理にかなっているのと同じくらい:)

PS:この振る舞いは、引数として参照call_user_func_array()をとることができ、array()参照引数を受け入れる関数を呼び出すことができる理由です。

于 2012-11-01T17:37:00.527 に答える
1

おそらく、これはそれをより明確にするでしょう:

$arr = array(1,1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
$arr2[1]++;
/* $a == 2, $arr == array(2) */
var_dump($arr);
//outputs array(2) { [0]=> &int(2) [1]=> int(1) } 

値が増加する理由は、the reference inside the array is preserved in the normal assignment. $arr2[0]のコピーですが、$arr[0]すべて$a同じ値を参照するようになりました。が増加しないことに注意してください。$arr2$arr$arr2[1]++$arr[1]

于 2012-11-01T17:34:36.933 に答える