Shallow CopyとDeep Copy
浅いコピー(Shallow)は参照渡しで深い(Deep)コピーはclone
- 以下の結果は
コンストラクタ
44
- -
となる。コンストラクタは1回しか呼ばれていないが、デストラクタが2回あるのは、cloneで作成したオブジェクトが新しいメモリ領域を使用するからだ。cloneを利用せず、$obj2 = $objとするとこれはPHP5の仕様で参照渡しになる。ヴァージョン4だとデフォルトでDeepコピー、のはず。
<?php class Foo{ var $val; function __construct(){ print "コンストラクタ<br>"; } function __destruct(){ print "デストラクタ<br>"; } function set($v){ $this->val = $v; } function get(){ return $this->val; } } $obj = new Foo; $obj->set(4); print $obj->get(); $obj2 = clone $obj; print $obj2->get(); print "<hr>"; $obj->set(5); print $obj->get(); print $obj2->get(); ?>