为什么临时变量需要更改数组元素,为什么最后需要取消设置?
Why the temporary variable needs in changing array elements and why it needs to be unset at the end?
考虑下面的代码片段,它通过引用传递直接更改(将值转换为大写)数组的值。
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
?>
输出:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
我完全没看懂上面的代码。我对上面的代码有以下疑问:
- 在
foreach
循环中,我完全不理解 $color = strtoupper($color);
中的这个语句。为什么使用临时变量$color
,在函数strtoupper()
中为什么不传递引用&$color
,只传递$color
?
- 为什么变量
$color
没有设置?取消设置之前里面装了什么?
- 注释是什么意思确保下面写到
$color 不会修改最后一个数组元素 作为数组的最后一个元素,即 yellow 也被修改了吗?
简而言之,请逐步解释 foreach
循环中的代码中发生了什么。
请大家解答我的疑惑
注意:以上代码示例取自PHP手册的数组章节。
这里是防御性编程。
在 foreach()
循环的每次迭代中,都会在 $color
变量中创建对当前项目值的引用,从而允许向其写入新值。但是,当迭代结束时,$color
变量仍然包含对最后一个数组项值的引用,允许程序员重复使用 $color
变量进行写入以更新数组中的该项,这可能不是预期的结果。 unset()
在循环破坏引用后对变量进行赋值,避免了这种风险。
以您的示例为基础:
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
//unset($color);
/* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
$color='hello';
print_r($colors);
输出:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => hello
)
考虑下面的代码片段,它通过引用传递直接更改(将值转换为大写)数组的值。
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
?>
输出:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
我完全没看懂上面的代码。我对上面的代码有以下疑问:
- 在
foreach
循环中,我完全不理解$color = strtoupper($color);
中的这个语句。为什么使用临时变量$color
,在函数strtoupper()
中为什么不传递引用&$color
,只传递$color
? - 为什么变量
$color
没有设置?取消设置之前里面装了什么? - 注释是什么意思确保下面写到 $color 不会修改最后一个数组元素 作为数组的最后一个元素,即 yellow 也被修改了吗?
简而言之,请逐步解释 foreach
循环中的代码中发生了什么。
请大家解答我的疑惑
注意:以上代码示例取自PHP手册的数组章节。
这里是防御性编程。
在 foreach()
循环的每次迭代中,都会在 $color
变量中创建对当前项目值的引用,从而允许向其写入新值。但是,当迭代结束时,$color
变量仍然包含对最后一个数组项值的引用,允许程序员重复使用 $color
变量进行写入以更新数组中的该项,这可能不是预期的结果。 unset()
在循环破坏引用后对变量进行赋值,避免了这种风险。
以您的示例为基础:
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = strtoupper($color);
}
//unset($color);
/* ensure that following writes to
$color will not modify the last array element */
print_r($colors);
$color='hello';
print_r($colors);
输出:
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => YELLOW
)
Array
(
[0] => RED
[1] => BLUE
[2] => GREEN
[3] => hello
)