PHP地址引用趣例 && foreach机制窥探
先上代码:
$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';
data[0]的值。这个赋值导致变量val和$data[0]指向不同的内存空间。 -
第一次语句执行:
$val = &$data[0];
data[0](原始数组第一个单元)。data[0]指向相同的内存空间A。 -
第二次循环:
$key = 1; $val = 'b';
赋值操作导致data[0]指向相同的内存空间,所以$data[0]的值也改变了。 -
第二次语句执行:
$val = &$data[1];
data[1](原始数组第二个单元)。data[1]指向相同的内存空间B。 -
第三次循环:
$key = 2; $val = 'c';
赋值操作导致data[1]指向相同的内存空间,所以$data[1]的值也改变了。 -
第三次语句执行:
$val = &$data[2];
data[2](原始数组第三个单元)。data[2]指向相同的内存空间C。
可参考PHP.net网站关于array、foreach和reference三个章节中的相关说明。
个人理解:
这个有趣的代码其根本问题是foreach的运行机制,每次进入循环的时候,会对 $key
和 $val
做赋值操作,而在循环体内,将本来指向临时内存空间的$val
指向了$data
数组中的真实位置,所以在foreach下次循环伊始进行val赋值操作的时候,就覆盖了上一次循环体内val指向的data数组中的值