[PHP-users 3526] コンストラクタ内での$thisの代入
Mashiki
php-users@php.gr.jp
Wed, 14 Nov 2001 15:17:43 +0900
Mashikiです。
以下のクラスAをnewすると、無限の領域がkeepされて
しまうような気がします。実際に実行してみると少なくとも
5個以上の異なるクラスAのオブジェクトが作成され、
コード通りの動作をしますが、予想に反してメモリ
不足によるサーバーのエラーや極端な速度低下などは
発生しません。以下、ソースと実行結果です。
//−−−phpソース−−−
<html><body>
<?php
class A {
var $aa = 'ZZ';
var $init;
function A() { // Constractor
$this->init = $this; // ★
}
}
$x = new A;
$x->aa = 'AA';
$x->init->aa = 'BB';
$x->init->init->aa = 'CC';
$x->init->init->init->aa = 'DD';
echo "x0 : {$x->aa}<br>\n";
echo "x1 : {$x->init->aa}<br>\n";
echo "x2 : {$x->init->init->aa}<br>\n";
echo "x3 : {$x->init->init->init->aa}<br>\n";
echo "x4 : {$x->init->init->init->init->aa}<br>\n";
echo "x5 : {$x->init->init->init->init->init->aa}<br>\n";
?>
</body></html>
// −−− ソース終了 −−−
*** 実行結果 ***
x0 : AA
x1 : BB
x2 : CC
x3 : DD
x4 : ZZ
x5 : ZZ
*** 実行結果おしまい ***
実行結果から、ひとつのオブジェクト $x = new A; を作成
しただけで、少なくとも再帰的に5個のオブジェクトができて
います。また、代入を行っていないx4とx5も初期値が入って
います。
この振る舞いはどのように解釈したらよいのでしょうか。
・クラスは無限に作られているのでしょうか?
・有限の個数が決められており、コンストラクタ実行時に
そこまでのコピーが作られるのでしょうか?
・または都合よく、参照なり、代入したときに新たに作成
されるのでしょうか?
本当にやりたいことは、以下の3点の理由により、オブジェクトの
生成時に自分自身のコピーを持ちたいのです。
・オブジェクト生成時にコンストラクタに、多数のパラメータを渡し
複雑な(コストの かる)処理をさせたい
・生成後もメソッドにより随時状態が変わっていく
・オブジェクト自身のメソッドにより、生成時との差を取得したい
しかし、コンストラクタ内で「$this->init = $this; // ★」の代わりに
「$this->init =& $this;」と書くと、このクラスが「$a =& new A;」の
ように生成されたとき、意図したとおりに動かないと思い、上記の
ような書き方を思いつきましたが、副作用が気になりました。
識者の皆様のアドバイスをお願いします。