奇妙な PHP コード
コードは次のとおりです。
<?php
$data = array('a', 'b', 'c');
foreach ($data as $key => $val) {
$val = &$data[$key];
}
質問 1: プログラムが実行され、各ループが終了した後の変数 $data の値はいくらですか?説明してください。
質問 2: プログラムの実行後、変数 $data の値はいくらですか?説明してください。
答え:
記事で言及されている配列 $data の完全な式は次のとおりです:
$data = array(
0 => 'a', / / メモリ空間 A
1 => 'b', // メモリ空間 B
2 => 'c', // メモリ空間 C
);
ループ処理:
$ key = 0; $val = 'a'; // $val は変数 $data[0] の値をコピーします。この割り当てにより、変数 $val が作成され、新しいメモリ空間 X を指します。$val と $data[0] は異なるメモリ空間を指します。
$val = &$data[0]; // $val は変数 $data[0] (元の配列の最初のユニット) を直接指す参照になります。 $val と $data[0] は同じメモリ空間 A を指します。
$key = 1; $val = 'b'; // 代入操作により、$val が指すメモリ空間の値が変更されるため、$data は同じメモリ空間を指します。 [0] の値も変更されました。
$val = &$data[1]; // $val は参照のままですが、変数 $data[1] (元の配列の 2 番目の単位) を指します。 $val と $data[1] は同じメモリ空間 B を指します。
$key = 2; $val = 'c'; // 代入操作により、$val が指すメモリ空間の値が変更されるため、$data は同じメモリ空間を指します。 [1] の値も変更されました。
$val = &$data[2]; // $val は参照のままですが、変数 $data[2] (元の配列の 3 番目の単位) を指します。 $val と $data[2] は同じメモリ空間 C を指します。
PHP.net Web サイトの配列、foreach、およびリファレンスの 3 つの章にある関連する手順を参照してください。