Shallow CopyとDeep Copy

浅いコピー(Shallow)は参照渡しで深い(Deep)コピーはclone

  • 以下の結果は

コンストラク
44

                                      • -

54デストラク
デストラク

となる。コンストラクタは1回しか呼ばれていないが、デストラクタが2回あるのは、cloneで作成したオブジェクトが新しいメモリ領域を使用するからだ。cloneを利用せず、$obj2 = $objとするとこれはPHP5の仕様で参照渡しになる。ヴァージョン4だとデフォルトでDeepコピー、のはず。

  • C言語mallocあたりをいぢり始めつつC++でクラスの基本を勉強すると理解必須の箇所になってくる感じでした。
<?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();
?>