リファレンスよくわからん

call_user_func_array のバグと回避策

トラックバックがきたので、

配列とリファレンスの奇妙な動作

注意:ここで、$a と $b は完全に同じで、$a が $b を指しているわけではなく、その逆でもありません。$a と$b は同じ場所を指しているのです。


なるほど。

PHPそのもののソースを読んでないので憶測だけど、
リファレンス設定状態(とかリファレンスカウンタ)みたいなものがあるんじゃないかと思うんです。

[php]<?php function aaa(&$str) { $str = 'hello'; }

$tmp = array('abc'); $s =& $tmp[0];

call_user_func_array('aaa', $tmp);

echo $tmp[0]; // 'hello' を表示[/php]
[php]<?php function aaa(&$str) { $str = 'hello'; }

$tmp = array('abc'); $s =& $tmp[0]; unset($s);

call_user_func_array('aaa', $tmp);

echo $tmp[0]; // 'abc' を表示[/php]
まぁここまでは納得できる気もするのですが、解せないのが次。
[php]<?php function aaa(&$str) { $str = 'hello'; }

$tmp = array('abc'); $s =& $tmp[0]; $b='abc'; $s = & $b;

call_user_func_array('aaa', $tmp); // 'hello' と表示 [/php]
監視対象の変数・・・この場合は $s が unset された場合はリファレンス状態を解除するが、
別のリファレンスが割り当てられたときは解除されない・・・という理解でいいのかな。