<?php
$arr[0] = 'A';
$tmp = & $arr[0]; //这个引用传值道底对$arr[0]做了什么?我一直以为这条语句只会改变$tmp的值。$foo = $arr; //这里并没有使用 &
$arr[0] = 'C';print_r($foo);结果:
Array
(
[0] => C
)为什么结果会是C,而不是A呢?
如果注释掉 $tmp = & $arr[0]; 结果就是A了。
如果$arr[0]只是一个普通变量,而不是一个数组元素,在使用引用传值后也不会出现这种情况。
为什么会这样呢?
$arr[0] = 'A';
$tmp = & $arr[0]; //这个引用传值道底对$arr[0]做了什么?我一直以为这条语句只会改变$tmp的值。$foo = $arr; //这里并没有使用 &
$arr[0] = 'C';print_r($foo);结果:
Array
(
[0] => C
)为什么结果会是C,而不是A呢?
如果注释掉 $tmp = & $arr[0]; 结果就是A了。
如果$arr[0]只是一个普通变量,而不是一个数组元素,在使用引用传值后也不会出现这种情况。
为什么会这样呢?
解决方案 »
- 中国移动飞信php类 求用法
- 怎么用按钮的方式来访问PHP里面的函数?
- 请问网页为什么会 出现格式“><FONT size=1> 这几年,对于大学生”
- 关于php垮平台及执行效率的问题
- 一个thinkphp的问题
- smarty 模板循环生成的问题
- 急急!!请教文本显示问题
- 急。。在线等---请教高手怎样配置APPACH 实现ASP?
- 我要寫入的數據中這兩種符號 ' " 怎麼辦,不能成功的寫入數據庫????
- 斑竹:怎么没人回答我的问题呀。。。我给的100分。。。我很急用呀。再给100分。。200分咯
- 在文本框内输入任意一个网址后,能够获得网站的截图和title keyword信息,可以做到吗?
- 求根据ip打开地区的网页程序,比如在西安就打开a.htm,在汉中就打开b.htm等等。
$tmp = & $arr[0];
$foo = $arr;
$arr[1] = 'C'; //看这里, 这个元素没有没引用, 下面打印出来的会是A
print_r($foo);
这个问题以前也没遇到过, 还多亏楼主有此一问
Note: $a and $b are completely equal here. $a is not pointing to $b or vice versa. $a and $b are pointing to the same place.
Note: If arrays with references are copied, their values are not dereferenced. This is valid also for arrays passed by value to functions. 正好就是解释你的例子.不过谢谢楼主,没你这个例子,先看时还真没明白:)
$arr[0] = 'A';//这里定义了一个变量,变量指向数组的第一个元素地址,这个数组只有一个元素就是'A'
$tmp = & $arr[0]; //这里将数组的第一个元素的地址赋值给$tmp$foo = $arr; //这里虽然没有使用&但是将数组赋值给另一个变量时是将数组的第一个元素的地址赋值给变量。这个时候$tmp和$foo以及$arr都指向数组的首地址。
$arr[0] = 'C';print_r($foo);
?>
修改了第一个元素值后,print $foo or $tmp or $arr得到的结果都是
Array
(
[0] => C
)
这句该怎么理解呢?进一步测试:$arr = array('A','B'); //此时$arr[0]存储的是值“A”
$tmp = & $arr[0]; //此时$arr[0]中的值已变成一个指向“A”的数据空间的地址。$foo = $arr; //赋值后,此时$arr[0]和$foo[0]其实指向同一数据空间。
$arr[0] = 'change in $arr'; //因此,不管是改变$arr[0],
$foo[0] = 'change in $foo'; //还是改变$foo[0],都将是对同一数据空间里的值进行操作。echo '($foo)'; print_r($foo);
echo '($arr)'; print_r($arr);
以上的注释便是我的理解,不知道对不对?如果正确的话,小弟仍有一事不明白,为啥普通变量不会出现这种情况?例如:$a = "ABC";
$tmp = & $a; //此时$a中存储的仍然是值“ABC‘,而不会像上面数组元素那样变成值的地址。
看看这个应该能理解啦!
<?php
function get_arr($arr){
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr(&$arr1);
get_arr($arr2);
echo count($arr1);
echo count($arr2);
print_r($arr1);
?>
<?php
$test = 'aaaaaa';
$abc = & $test;
unset($test);
echo $abc;
echo $test;
?>
http://www.laruence.com/2008/09/19/520.html
猜想数组的情况亦类似.
$arr[0] = 'A';
$tmp = & $arr[0]; //$arr[0]是个Zval体,is_ref设为1,$foo = $arr; //数组每个元素共用一个Zval
$arr[0] = 'C';//因为对应zval的is_ref为1,所以并未发生变量分离。print_r($foo);