この間ギョームでディープコピーが必要になるケースを初体験したので復習です。

インスタンスをコピーするとき、PHPでは、clone を利用しますが、このときコピーされたインスタンスにある参照型のメンバは、参照先のアドレスがコピーされます。これを shallow copy といいます。

簡単なshallow copyのサンプルを書いてみました。 $player を $player2 に clone したあと、 $player のメンバである name と status->level を変更しています。$player と $player2 は、別々のインスタンスであるため、$playerと$player2のメンバは異なるはずですが、nameについては異なっているものの、status->level については、同じになってしまっています。

アドレス参照するのは参照型のメンバだけです。なので、シャローコピーとディープコピーの違い – くろの雑記帳 にある図はちょっと間違いで、数値や文字列はそのままコピーされます。

status もコピーする仕組みを、deep copyといいます。ディープコピーも実装してみました。
PHPの場合、__clone というマジックメソッドを利用する事で、clone時の動作に手を加える事ができます。

シャローコピーにするかディープコピーにするかは、インスタンスをコピーする目的や、参照型メンバの役割によって変わると思うので、自分がなんのために clone しているのか意識する事が重要ですね。

カテゴリー:

5 thoughts on “PHPにおけるインスタンスのシャローコピーとディープコピー

  1. oppara より:

    PHPにおけるインスタンスのシャローコピーとディープコピー | この先生きのこるには

  2. tohokuaiki より:

    久しぶりのPHPへぇぇネタ。

  3. masutaka26 より:

    こういうの見ても違和感がなくなってきた。

  4. iww より:

    『シャローコピーとディープコピーの違い – くろの雑記帳 にある図はちょっと間違いで、数値や文字列はそのままコピーされます。』

  5. pcook より:

    これを見ると、文字列もコピーされてなさそうですが、PHPバージョンなんかで違うのでしょうか
    http://php.net/manual/ja/features.gc.refcounting-basics.php

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください