为什么临时变量需要更改数组元素,为什么最后需要取消设置?

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
)

我完全没看懂上面的代码。我对上面的代码有以下疑问:

  1. foreach 循环中,我完全不理解 $color = strtoupper($color); 中的这个语句。为什么使用临时变量$color,在函数strtoupper()中为什么不传递引用&$color,只传递$color
  2. 为什么变量 $color 没有设置?取消设置之前里面装了什么?
  3. 注释是什么意思确保下面写到 $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
)

https://eval.in/897010