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

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

インスタンスをコピーするとき、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 しているのか意識する事が重要ですね。

投稿者: halt

PHPプログラマ。

“PHPにおけるインスタンスのシャローコピーとディープコピー” への 4 件のフィードバック

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

コメントを残す

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

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