[PHP-users 10604] Re: 1つのインスタンスを参照する2つの変数のチェック方法

WADA Masashi php-users@php.gr.jp
Mon, 07 Oct 2002 18:58:41 +0900


 和田です。

KUROSAWA Akira wrote:
>> 上記の check_reference() を利用した次のコードを実行してみると、
>> 
>> $a = 1;
>> $b = $a;
>> print "$a, $b : ".(check_reference($a, $b) ? "ref.\n" : "not ref.\n");
>> $a = 2;
>> print "$a, $b : ".(check_reference($a, $b) ? "ref.\n" : "not ref.\n");
>> 
>> 結果は
>> 
>> 1, 1 : ref.
>> 2, 1 : not ref.
>> 
>> となります(テスト環境はPHP4.1.2/4.2.2)。
>
>多分、タイプミスだと思うんですが、2行目の「$b = $a」は「$b =& $a」ですよね。
>だとすれば、これは期待通りの動作です。

いえ、「$b = $a」です。

 メモリの有効利用と高速化を目指して、PHP4から Reference Counting
が導入されています。例えば次のようなコードについて考えてみます。

  $a = 1;  //---(1)
  $b = $a; //---(2)
  $a = 2;  //---(3)
  $b = 3;  //---(4)

 (1).$a はメモリ上に確保された 1 という値を参照します。
 (2)."="は代入演算子ですから、本来なら $b に 1 という値がコピー
   されるはずです。しかしPHPの内部では $b は(1)で確保された 1
   を参照するだけに留めています。
 (3).新たな値 2 がメモリ上に用意されて、$a はこちらを参照します。
   $b は(1)で確保された 1 を参照したままです。
  (4).新たな値 3 がメモリ上に用意されて、$b はこちらを参照します。
   (1)で確保された 1 は誰も参照しなくなったのでメモリが解放さ
   れます。

というのが Reference Counting の考え方です。私の理解が間違ってい
るかもしれないので、Zend のページで確認してみて下さい。
  → http://www.zend.com/zend/art/ref-count.php

 プログラマーが「$b = & $a;」で直接指示するような Reference と
は少し意味が違うので注意しましょう。


 そういえば、以前 Reference Counting の話題が上がっていました。

> [PHP-users 827] phpによるOOPについて
> [PHP-users 828] 参照演算子について (was phpによる OOPについて )
> [PHP-users 830] Re: 参照演算子について (was phpによる OOPについて )
> [PHP-users 831] Re: 参照演算子について (was phpによる OOPについて )


それにしても

$a = 1;
$b = 1;
print "$a, $b : ".(check_reference($a, $b) ? "ref.\n" : "not ref.\n");
$a = 2;
print "$a, $b : ".(check_reference($a, $b) ? "ref.\n" : "not ref.\n");

の結果が

1, 1 : ref.
2, 1 : not ref.

になるのはおもしろいですね。


----
和田雅志 (WADA Masashi)
wada@hh.iij4u.or.jp