リファレンスよくわからん
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 された場合はリファレンス状態を解除するが、
別のリファレンスが割り当てられたときは解除されない・・・という理解でいいのかな。