关于传引用的问题

以前,在某网友的博客里,看到一个关于传引用的问题。(http://www.dengwz.com/?p=532)在我看过之后,也是百思不得其解。

虽然,我知道在变量A给变量B赋值时,如果加上引用(&),就会导致:改变其中任意一个变量时,另一个变量也会随之改变。就好像是同一个变量,只是名称不一样而已。这种方法,可以在调用函数时,不返回值的同时,改变传递过来的变量的值。如下,就会输出2
[code lang=”php”]$a=1;
function demo(&$b)
{
$b++;
}
demo($a);
echo $a;[/code]
在一场面试中,我就遇到关于“传值和传地址是什么意思”的问题。因为Php自学的关系(而且现在都还没有买书,不过已经准备了),我压根不知道他说的什么意思。脑海里的第一个念头是:url传值?传url地址?好像完全没关系啊?就只好说不知道。

回来的时候,我百度了下(百度是最好的老师,我就是这样学习的)传值和传地址。才明白,这个传值原来是赋值(说明该买书看看了)。传地址就是前面说到的传引用(好像网上说,只有C语言才区分传引用和传地址,在Php里面是一个意思。之前我还不知道加&原来叫传引用,再次说明该买书看看了)

就在这个时候,也浏览到关于文章开头提到的类似问题(http://www.jb51.net/article/22140.htm)。在好奇心的的驱使下,我仔细的阅读了他的内容,自己也做了测试,最后终于明白了问题。

在使用两个foreach语句时,如果在第一个foreach循环的值(如&$value)前面加上引用(&)。就会倒置后面的foreach使用到相同变量($value)时,改变前者最后一次引用到的变量的值,也就是改变$arr[2]的值。如下
[code lang=”php”]$arr  = array(‘a’, ‘b’, ‘c’);
$arr2 = array(‘d’, ‘e’, ‘f’);
foreach($arr as &$value){}
foreach($arr2 as $value)
{
print_r($arr);
}[/code]
我们会看到出来的结果是
[code lang=”php”]Array
(
[0] => a
[1] => b
[2] => d
)
Array
(
[0] => a
[1] => b
[2] => e
)
Array
(
[0] => a
[1] => b
[2] => f
)[/code]
这样很容易看出来,$arr[2]的值一直在改变。这时候我们想想,如果没有$arr2,全部都用$arr会怎样?
[code lang=”php”]$arr  = array(‘a’, ‘b’, ‘c’);
foreach($arr as &$value){}
foreach($arr as $value)
{
print_r($arr);
}[/code]
结果如下
[code lang=”php”]Array
(
[0] => a
[1] => b
[2] => a
)
Array
(
[0] => a
[1] => b
[2] => b
)
Array
(
[0] => a
[1] => b
[2] => b
)[/code]
这样我们可以很直观的看到,$arr[2]在第一次变成a,第二次变成b,第三次还是b。这是为什么呢?原因很简单,在第二次执行的时候,$arr[2]的值已经变成的b。第三次取值时,取出来的就是b。

ps: 其中一个网址里提到断开引用关系,那么,我们的问题又来了。$arr[0]和$arr[1]也没有断开,为什么他们不改变?
我个人的理解是,使用引用(&)同时,就会断开这个变量之前的引用关系。