据我所知,当您将变量传递给函数时,如果不使用引用符号(&),则表示函数内部的任何更改都不会影响函数外部的变量。换句话说,这意味着编译器会将外部变量的副本用于函数内部,不是吗?
但是当我运行这些测试代码时,它不会发生这种情况。 任何人都可以解释我在这里想念的吗?谢谢
我的测试代码:预期结果应为3,但它变为1?
function test($arr2) {
foreach($arr2 as &$item) {
$item = 1;
}
}
$arr = array(2);
foreach($arr as &$item2) {
$item2 = 3;
}
test($arr);
print_r($arr);
答案 0 :(得分:2)
在你问过这个问题( #1 )之前,这个问题已经解决了几次。问题是由于:
$ value的引用和最后一个数组元素仍然保留在 foreach循环。建议通过unset()来销毁它。
你需要在你的foreach之后取消设置最后$item2
:
foreach ($arr as &$item2) {
$item2 = 3;
}
unset($item2);
答案 1 :(得分:0)
这非常有趣,似乎数组的行为与php中的对象相同,其中新数组仍然保存成员标识符的副本(指向与从中复制的数组相同的值)。
从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,它指向同一个对象。
答案 2 :(得分:-1)
即使你没有将$ arr作为Reference变量传递,你仍然在函数test()中访问$ arr元素作为References。所以功能上的任何变化都会影响外部功能。
如果您希望仅在测试函数中更改$ arr(已在测试函数中传递为$ arr2),则从$ item中删除&