如下,
按照道理
$a=1;$b=2;$a=&$b;$b=5;echo 'a:'.$a."b:".$b; //输出都是5,这里$a=&$b这句导致$a,$b保持同一个引用。下面的就不理解了
$a=1;$b=2;function t(&$a,&$b){
$a=&$b;
$a=5;
}
t($a,$b);echo 'a:'.$a.'b:'.$b; //结果出于意料。$a输出1,$b输出5.
是怎么回事呢?
按照道理
$a=1;$b=2;$a=&$b;$b=5;echo 'a:'.$a."b:".$b; //输出都是5,这里$a=&$b这句导致$a,$b保持同一个引用。下面的就不理解了
$a=1;$b=2;function t(&$a,&$b){
$a=&$b;
$a=5;
}
t($a,$b);echo 'a:'.$a.'b:'.$b; //结果出于意料。$a输出1,$b输出5.
是怎么回事呢?
$a=&$b;
$a=5;
}
t($a,$b);echo 'a:'.$a.'b:'.$b;首先函数t里面的参数$a,$b是函数内部的变量和外面定义的$a,$b是完全不一样的,你都写成$a,$b容易混淆,其实函数改成这样是一样的(和函数参数是$a和$b的时候,调试的结果是一样的):
function t(&$c,&$d){
$c=&$d;
$c=5;
}
当用xdebug调试的时候,
function t(&$c,&$d){
$c=&$d;
xdebug_debug_zval( 'd' );
xdebug_debug_zval( 'c' );
$c=5;
}
调试的结果是:
d:(refcount=4, is_ref=1),int 2c:(refcount=4, is_ref=1),int 2关于refcount和is_ref可以参考一下手册:
http://php.net/manual/zh/features.gc.refcounting-basics.php为什么这里refcount是4那?可能是:
1.$b=2;这一句就创建了一个容器,并有1个符号指向了这个容器,此时count=1
2.function t(&$c,&$d) 调用此函数时,函数内部变量$d也作为一个符号指向了这个容器,此时count=2
3.$c=&$d; 里面的"&$d"也复制了一个指向此容器的符号,此时count=3
4.$c=&$d; $c也是一个指向此容器的符号,所以count=4当函数运行到$c=5;时,自然函数外部的变量$b也变成了5,因为他们都是指向同一个容器的符号.
外部变量$a,在函数内部先是产生了一个指向$a的容器的符号$c,
但是当$c=&$d;时,$c有变成了指向外部变量$b的容器的符号,所以外部变量$a在函数内部没有参与运算,所以还是1啊
后一段相当于
$a=1;$b=2;
$c =& $a;
$c = &$b;
$c = 5;
function t(&$a,&$b){ //&$a和&$b引用的是$a和$b的变量地址,而不是1和2的地址
$a=&$b; //$a=&$b $b的变量地址付给$a,所以现在$a现在就是于$b,$b还是$b
$a=5; //$a=5 === $b=5
}
t($a,$b);