[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