
今回は『PHPのコピーオンライトについて』のPart2になります。
================ <オブジェクト同士の代入> 下記のサンプルをご覧ください。 ——– 【サンプル:コード】 $a = new stdClass(); $b = $a; $a->foo = ‘bar’; $b->foo = ‘foo’;
【サンプル:説明】 ■1~2行目 変数同士のときと変わらないので割愛 ■3行目 ①変数$aのプロパティfooに、データとして’bar’を格納 ■4行目 ①変数$bのプロパティfooに、データとして’foo’を格納
——–
なんと、4行目後も『変数$bは編す$aを参照している状態』になります。 具体的に言うと、『変数$aも変数$bも、プロパティfooには’foo’が格納されている』のです!
理由は、「コピー元・コピー先のどちらも変更されていないため」です。 変更されたのは、あくまでも「$aのプロパティfoo」のため、COWは実行されません。
もし、参照ではなく『データを複製する』場合は、代入ではなくcloneを使用しましょう。 ——– $a = new stdClass(); $b = clone($a); $a->foo = ‘bar’; $b->foo = ‘foo’; // $a->fooは’bar’のまま ——–
上記で『そう言うことね(←わかってない)』となった方は、今は取り敢えず頭の片隅に入れておくだけで大丈夫です。 オブジェクトを使うようになった際に「COWあたりで問題があったような?」と思い出して頂ければ幸いです。
================
以上、『Part2:オブジェクト同士の代入』でした。 Part3へ続きます。