如下,
按照道理
$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.
是怎么回事呢?

解决方案 »

  1.   

    我原来的理解,php的引用类似C里面的指针,通过你这个例子看来是不一样的,一下是我的理解,不一定正确$a=1;$b=2;function t(&$a,&$b){
    $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啊
      

  2.   

    函数体内的语句$a=&$b;变量a是b的引用,执行到这里的时候,要产生分离分离的结果就是$a成了函数内的局部变量
      

  3.   

    你的两段代码并不等价!
    后一段相当于
    $a=1;$b=2;
    $c =& $a;
    $c = &$b;
    $c = 5;
      

  4.   

    在下愚见:
    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);