PHPのコピーオンライトについて Part2

最終更新: 2019年4月10日



今回は『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へ続きます。

  • Grey Facebook Icon
  • Grey Twitter Icon
​株式会社エイト/東京都渋谷区 / 大阪 /  福岡

© 2018 Eight inc.