[PHP-users 3557] Re: コンストラクタ内での$this の代入

Mashiki php-users@php.gr.jp
Thu, 15 Nov 2001 00:18:03 +0900


小山さんありがとうございます。

>   3番目だと思います。PHP の文法の基本として、参照・代入の際に対象が存
> 在しなければ勝手に生成というのがあります。今回の例もそれに習って、参照
> なり代入なりが発生した時点でオブジェクトが生成されたと考えるのが適当だ
> と思います。

 対象が存在しないわけではないので、今回の例では納得ができません。
(読み方が甘いのかなあ)
前回のソースを少し直して

<html><body>
<?php
  class A {
    var $aa = 'ZZ';
    var $init;
    function A($bb) { // Constractor
      $this->aa = $bb;  // ★コンストラクタにパラメータをつけた
      $this->init = $this;
    }
  }

  $x = new A('YY');
  $x->init->init->aa = 'CC'; // ★いきなり代入に変更
  $x->init->aa = 'BB';
  $x->aa = 'AA';

  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";
?>
</body></html>

結果は

x0 : AA
x1 : BB
x2 : CC
x3 : YY
x4 : YY

となり、この時点では存在しない
$x->init->init->init->aa や
$x->init->init->init->init->aa にも
初めて$xに代入を行ったときのコンストラクタへのパラメータが
コピーされています。


 4番目を思いついたのですが...

・PHP4では $a=$b; のような代入によるコピーが行われた場合、
 変数、$aと$bはどちらかの内容が変わるタイミングで実際の
 コピーが作成されるよう管理されており、それまでは内部的には
 同じメモリー上のデータを参照している。

 と、考えるとすべての振る舞いの説明がつきます。そこで、PHPの
マニュアルを読み返してみましたが(以前、この記述を見つけ、
そのときはわけもわからず読み流していたような気がするの
ですが)、見つかりませんでした。

#Javaの文字列オブジェクトはこれに近いことをやっていると
# 記憶しています。