+ -
当前位置:首页 → 问答吧 → php 引用传递

php 引用传递

时间:2011-12-21

来源:互联网

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

作者: hero1010   发布时间: 2011-12-21

我原来的理解,php的引用类似C里面的指针,通过你这个例子看来是不一样的,一下是我的理解,不一定正确
PHP code

$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 2

c:

(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啊


作者: sink   发布时间: 2011-12-22

函数体内的语句$a=&$b;

变量a是b的引用,执行到这里的时候,要产生分离。。。

分离的结果就是$a成了函数内的局部变量

作者: amani11   发布时间: 2011-12-22