程序员

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

2018-08-31  本文已影响1人  半亩房顶

先上代码:

$data = array(‘a’, ‘b’, ‘c’);
foreach($data as $key=>$val) {
    $val = &$data[$key];
}

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

$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
);

循环过程:

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

个人理解:

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

参考图
上一篇下一篇

猜你喜欢

热点阅读