[PHP-users 11682] Re: コンストラクタ引数にオブジェクトを

KOYAMA Tetsuji php-users@php.gr.jp
Fri, 22 Nov 2002 02:10:15 +0900


  小山です。さらにおまけ。

At Thu, 21 Nov 2002 13:42:37 +0900,
fumiyaKitamura wrote:
> 私は...
>  1.$OBJはポインタを指し示している
>  2. $this->Ref = $OBJ; の代入でポインタが格納される
> のように間違っていました。(^-^)>

  年末発売予定の某雑誌原稿より抜粋。(笑)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
●クローン

ZE2でのオブジェクトの代入は、Javaライクに参照渡しがデフォルトになりま
した。つまり

	$obj = new MyClass;
	$obj2 = $obj;

とすると$objと$obj2は同じオブジェクトを指しています。これは$objへの変
更は$obj2にも反映するということです。従来と同様にオブジェクトをコピー
したいときには__clone()というメソッドを呼びます。

リスト3では、オリジナルの$objオブジェクトから、$obj1は「=」で、$obj2は
「__clone()」で値をコピーしています。その後$objの内容を書き換えると、=
でコピーした$obj1は同様に変更されますが、__clone()でコピーした$obj2は
もとの値のままです。

===リスト3 クローンサンプル===========================================
<?php
class MyClass {
  var $var;
};

$obj = new MyClass;
$obj->var = 'hoge';

$obj1 = $obj;
$obj2 = $obj->__clone();

$obj->var = 'fuga';

print $obj1->var;  // 'fuga'
print $obj2->var;  // 'hoge'
?>
======================================================================	
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  ということで Zend Engine 2 (PHP 5.0) では、キタムラさんのおそらく望
み通りに、参照渡しがデフォルトになる予定です。

-- 
	小山 哲志@ビート・クラフト
	koyama@beatcraft.com
	koyama@hoge.org