[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;」の
ように生成されたとき、意図したとおりに動かないと思い、上記の
ような書き方を思いつきましたが、副作用が気になりました。

識者の皆様のアドバイスをお願いします。