美文网首页程序员
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