<?php
$arr = array(1);
$a =& $arr[0];
$arr2 = $arr;
$arr2[0]++;
var_dump($arr);
このコード部分は2
です。 なぜですか?PHPリファレンス配列要素が接触することなく変更されました
arr2
の最初の要素は、$arr
に割り当てられていません。同じ配列に別名を付けることはありません。それはなぜですか?
<?php
$arr = array(1);
$a =& $arr[0];
$arr2 = $arr;
$arr2[0]++;
var_dump($arr);
このコード部分は2
です。 なぜですか?PHPリファレンス配列要素が接触することなく変更されました
arr2
の最初の要素は、$arr
に割り当てられていません。同じ配列に別名を付けることはありません。それはなぜですか?
1つの配列を次の配列に割り当てると、コピーが作成されます。しかし、$arr[0]
の要素は値ではなく参照値なので、参照のコピーが作成されます。したがって、最後に$arr[0]
と$arr2[0]
は同じものを参照しています。
これは配列よりも参照に関するものです。参照された値はコピーされません。これはオブジェクトにも適用されます。考えてみましょう:
$ageRef = 7;
$mike = new stdClass();
$mike->age = &$ageRef; // create a reference
$mike->fruit = 'apple';
$john = clone $mike; // clone, so $mike and $john are distinct objects
$john->age = 17; // the reference will survive the cloning! This will change $mike
$john->fruit = 'orange'; // only $john is affected, since it's a distinct object
echo $mike->age . " | " . $mike->fruit; // 17 | apple
はthis documentation pageともthis oneに最初のユーザーの注意を参照してください。
これは奇妙です。 '$ arr [0]'への参照を作成したようには見えないので、 '$ arr [0]'を参照にする必要があります。私は偶然、これを今までに偶然実行していないことに驚いています。 –
$ arr2は最後に1だけインクリメントされ、$ arrにあったものが割り当てられているためです。私はprint_r($ arr)を提案し、それを調べます。あなたがこれで成し遂げようとしていることは確かではありません。 – clearshot66