为什么在 PHP `foreach` 循环中使用引用传递会在循环结束后修改数组?

Susan Sarandon
发布: 2024-11-13 09:19:02
原创
391 人浏览过

Why does using pass-by-reference in a PHP `foreach` loop modify the array after the loop ends?

PHP Foreach 按引用传递和数组修改

在 PHP 中,在 foreach 循环中使用按引用传递可能会导致意外行为。考虑以下代码:

$arr = ["foo", "bar", "baz"];

foreach ($arr as &$item) {}
// Array remains unchanged: ["foo", "bar", "baz"]

foreach ($arr as $item) {}
// Array is modified: ["foo", "bar", "bar"]
登录后复制

为什么第二个循环修改数组?

在第一个循环中,$item 变量是通过引用传递的。这意味着对 $item 所做的更改也会影响 $arr 数组中的相应元素。但是,在第二个循环中,$item 是按值传递的。因此,对 $item 所做的更改不会影响数组。

至关重要的是,在第一个循环之后,$item 仍然引用 $arr 的最后一个元素。当第二个循环遍历数组时,$item 的每个值都会覆盖 $arr 的最后一个元素,因为它们都引用相同的内存位置。

调试输出

要理解其行为,我们可以回显 $item 的当前值,并在每次循环迭代期间递归打印 $arr 数组。

第一个循环:

foo
Array ( [0] => foo [1] => bar [2] => baz )

bar
Array ( [0] => foo [1] => bar [2] => baz )

baz
Array ( [0] => foo [1] => bar [2] => baz )
登录后复制

第一次循环后,$item指向$arr的最后一个元素。

第二次循环:

foo
Array ( [0] => foo [1] => bar [2] => foo )

bar
Array ( [0] => foo [1] => bar [2] => bar )

bar
Array ( [0] => foo [1] => bar [2] => bar )
登录后复制

$item的每个值都被覆盖,它还会修改 $arr 的最后一个元素。

这是一个 Bug 吗?

不,这种行为不是一个 Bug,而是 pass- 的预期行为通过引用。了解通过引用传递变量的含义并正确使用它非常重要。

以上是为什么在 PHP `foreach` 循环中使用引用传递会在循环结束后修改数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板