美文网首页程序员
PHP地址引用趣例 && foreach机制窥探

PHP地址引用趣例 && foreach机制窥探

作者: 半亩房顶 | 来源:发表于2018-08-31 10:48 被阅读1次

    先上代码:

    $data = array(‘a’, ‘b’, ‘c’);
    foreach($data as $key=>$val) {
        $val = &$data[$key];
    }
    
    • 问题1: 程序执行时,每一次循环结束后变量$data的值是什么?请解释。

    答:当第一次循环时,第一次的值val是和data[key]址传递关系,共用同一地址,所以当下一次循环是data[key]发生改变,则共用2统一地址的第一次的val随着发生改变

    • 问题2: 程序执行完以后,变量$data的值是什么?请解释。

    $data = array(‘b’, ‘c’, ‘c’);

    解释:

    转载注解

    内容转自:http://www.php.cn/php-weizijiaocheng-187465.html
    文中所述数组$data的完整表达形式如下:

    $data = array(
      0 => 'a', // 内存空间A
      1 => 'b', // 内存空间B
      2 => 'c', // 内存空间C
    );
    

    循环过程:

    • 第一次循环:$key = 0; $val = 'a';
      val复制了变量data[0]的值。这个赋值导致变量val创建并指向一个新的内存空间X;val和$data[0]指向不同的内存空间。

    • 第一次语句执行:$val = &$data[0];
      val成为一个引用,直接指向变量data[0](原始数组第一个单元)。val和data[0]指向相同的内存空间A。

    • 第二次循环:$key = 1; $val = 'b';
      赋值操作导致val所指向的内存空间的值被改变了;data[0]指向相同的内存空间,所以$data[0]的值也改变了。

    • 第二次语句执行:$val = &$data[1];
      val还是一个引用,不过现在指向变量data[1](原始数组第二个单元)。val和data[1]指向相同的内存空间B。

    • 第三次循环:$key = 2; $val = 'c';
      赋值操作导致val所指向的内存空间的值被改变了;data[1]指向相同的内存空间,所以$data[1]的值也改变了。

    • 第三次语句执行:$val = &$data[2];
      val还是一个引用,不过现在指向变量data[2](原始数组第三个单元)。val和data[2]指向相同的内存空间C。

    可参考PHP.net网站关于array、foreach和reference三个章节中的相关说明。

    个人理解:

    这个有趣的代码其根本问题是foreach的运行机制,每次进入循环的时候,会对 $key$val做赋值操作,而在循环体内,将本来指向临时内存空间的$val指向了$data数组中的真实位置,所以在foreach下次循环伊始进行val赋值操作的时候,就覆盖了上一次循环体内val指向的data数组中的值

    参考图

    相关文章

      网友评论

        本文标题:PHP地址引用趣例 && foreach机制窥探

        本文链接:https://www.haomeiwen.com/subject/mbbdwftx.html