PHP “循环引用” 的点点滴滴

变量

  $a = 1

  echo memory_get_usage(), '<br />';   //  119632

  $b = $a

  echo memory_get_usage(), '<br />';   //  119680

  $a = 1;

   echo memory_get_usage(), '<br />';   //  119712

$a和 $b都指向$a的内存地址,并不会copy一块内存地址出来,因为COW(copy on writer),只有再对$a进行赋值的时候$b才能新创建一块内存地址,所以内存增加。

   $b = &$a 

  echo memory_get_usage(), '<br />';   //  119712

$a和$b指向一个内存地址,再对$a进行修改也不会创建新的内存地址,如果unset($b)那么之后消除$b对$a的引用,并不会把$a指向的内存地址给消除了

对象

class Person{

            public $Name = “张三”;

}

    $d = new Person();
    $e = $d;
    $d->name = "zhamgsan";
?>

 

此时$b和$a都同时指向一个内存地址,对$a 进行修改$a->Name = "李四"后  $a$b还是指向一块地址。

练习

$data = [a,b,c]

foreach($data as $k=>$v){

        $v = &$data[$k]

}

程序运行一遍后 $data打印出来是多少?

第一次循环 $k = 0  $v =  a 循环体内  $v = &$data[0]($v指向的是$data[0]的指针地址,如果再循环时$v变化的话会直接影响$data[0]的值)                                                                                                                                                ==>  a,b,c

第二次循环 $k = 1 $v  = b 因为$v变化,$v = &$data[0] 所以$data[0] = b ,循环体内 $v = &$data[1] = b     ===> b,b,c

第三次循环  $k= 2 $v  = c 同上$v变化 ,$v = &$data[1],所以$data[1] = c,循环体内$v= &$data[2] = c        ===>b,c,c

foreach ($arr2 as $key=>$val) {   //给$val赋值,执行到这里会改变上个循环中的值  
        $val = &$arr2[$key];     
        var_dump($arr2);
        echo "<br>";
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值