PHP:奇怪的引用变量

时间:2015-07-08 05:51:36

标签: php reference

据我所知,当您将变量传递给函数时,如果不使用引用符号(&),则表示函数内部的任何更改都不会影响函数外部的变量。换句话说,这意味着编译器会将外部变量的副本用于函数内部,不是吗?

但是当我运行这些测试代码时,它不会发生这种情况。 任何人都可以解释我在这里想念的吗?谢谢

我的测试代码:预期结果应为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);

3 个答案:

答案 0 :(得分:2)

在你问过这个问题( #1 )之前,这个问题已经解决了几次。问题是由于:

  

$ value的引用和最后一个数组元素仍然保留在   foreach循环。建议通过unset()来销毁它。

参考:PHP foreach()

你需要在你的foreach之后取消设置最后$item2

foreach ($arr as &$item2) {
    $item2 = 3;
}
unset($item2);

答案 1 :(得分:0)

这非常有趣,似乎数组的行为与php中的对象相同,其中新数组仍然保存成员标识符的副本(指向与从中复制的数组相同的值)。

  

从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,它指向同一个对象。

PHP Manual - Objects and references

答案 2 :(得分:-1)

即使你没有将$ arr作为Reference变量传递,你仍然在函数test()中访问$ arr元素作为References。所以功能上的任何变化都会影响外部功能。

如果您希望仅在测试函数中更改$ arr(已在测试函数中传递为$ arr2),则从$ item中删除&