一段稀奇古怪的PHP代码

代码如下:

<?php
$data = array('a', 'b', 'c');

foreach ($data as $key => $val) {
$val = &$data[$key];
}
?>


问题1: 程序执行时,每一次循环结束后变量$data的值是什么?请解释。
问题2: 程序执行完以后,变量$data的值是什么?请解释。

答案:

[quote]
文中所述数组$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三个章节中的相关说明。
[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值