zoukankan      html  css  js  c++  java
  • php的foreach中使用取地址符,注意释放

      先来举个例子:

     1 <?php
     2 
     3 $array = array(1, 2, 3);
     4 
     5 foreach ($array as &$value) {}
     6 
     7 // unset($value);
     8 
     9 foreach ($array as $value) {
    10     // print_r($array);
    11 }
    12 
    13 echo implode($array);// 122

    有的童鞋可能会答123,这里就说下,为什么是122。

    在第5行代码里,循环$array时,使用的取地址符。循环结束以后,并没有释放$value,注意foreach并没有自己的域。所以如果不释放掉他,他依然存在在以后的代码。就此可能埋下了意外的bug。

    循环结束后,这个$value指向的是数组第三个元素上。此时$array = array(1, 2, 3); 没有问题。  好,接着看第9行代码。

    循环的时候如下进行(可以打开第10行注释查看):

    把数组第一个元素的值1,给这个$value(指向的第三个元素上),第一次循环结束,数组是array(1, 2, 1);

    第二次循环,把第二个元素的值2,再给这个$value(它仍然指向的是第三个元素)。数组变成了array(1, 2, 2);

    第三次循环,把第三个元素的值2,再给这个$value,这样就变成了array(1, 2, 2);

    所以,写代码时,如果循环时,取了地址,循环结束时尽量要unset()掉。除非你自己知道自己在干什么哈哈。

    比如打开第7行的注释,那么结果就是123了。

  • 相关阅读:
    hdu4734 F(x)
    hdu2089 不要62 两解
    luogu2602 [ZJOI2010]数字计数 两解
    lemon
    UVA1218 完美的服务 Perfect Service
    luogu HNOI2003消防局的设立
    uva10891 game of sum
    uva10635 Prince and Princess
    UVA1394 And Then There Was One
    uva10003切木棍
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5201618.html
Copyright © 2011-2022 走看看