php 引用的问题
迷茫
迷茫 2017-04-11 09:08:52
[PHP讨论组]
$a = [1,2,3];
foreach($a as &$item){
    echo $item . ',';
}
//unset($item); // 引用赋值后不销毁对象
foreach($a as $item){
    echo $item . ',';
}

上面的代码的输出如下:
1,2,3,1,2,2
(网上的答案: 看最后一个输出的是2,而不是3,就是因为代码里没有销毁$item造成的,原因如下:第一个循环,把3的引用赋给了$item,第二个循环,把1赋给了$item,因为$item是引用,导致数组的元素3变成了1,明白了吗?)

看的不太明白,求大神 详细解答,谢谢!!!

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
大家讲道理
    $arr=[1,2,3];
    foreach ($arr as &$val) {
       echo $val;
    }
    // 1,2,3
    #unset($val);
    foreach ($arr as $val) {
        echo $val;
    } 
    //1,2,3
    
第一次循环后 $val = $arr[2] ;   
第二次循环:
$arr[2] = $val = $arr[0]; //1
$arr[2] = $val = $arr[1]; //2
$arr[2] = $val = $arr[2]; //2    $arr[2]赋值成2了
天蓬老师

答案

php是没有块级作用域的!!!
也就是说,第一个循环结束后,$item依然指向数组的第三个成员。
之后每次循环,就把数组的第一个值写到第三个成员,然后是第二个值写个第三个成员,然后是第二个值写个第三个成员,但此时第三个值已经被上次修改成2了,所以这次第三个值会被修改成2.

证明

这里。我们将这个代码修改一下,加点调试信息

$a = array(1,2,3);
foreach($a as &$item){
    echo $item . ',';
}
var_dump($a);
foreach($a as $item){
    var_dump($a);
    echo $item . ',';
}

上述程序输出结果为

1,2,3,array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(1)
}
1,array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}
2,array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}
2,

你看明白了吗?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号