Home  >  Article  >  Backend Development  >  一段刁钻古怪的PHP代码

一段刁钻古怪的PHP代码

WBOY
WBOYOriginal
2016-06-13 13:06:25836browse

一段稀奇古怪的PHP代码
代码如下:

<?php
$data = array('a', 'b', 'c');
foreach ($data as $key => $val) {
    $val = &$data[$key];
}


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

答案:

文中所述数组$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三个章节中的相关说明。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn