PHP:奇怪的引用变量


PHP: strange reference variable

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

但是当我运行这些测试代码时,它不会像那样发生。有人能解释一下我错过了什么吗?谢谢你

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

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

$value和最后一个数组元素的引用即使在$value之后也保持不变foreach循环。建议使用unset()销毁它。

参考文献:PHP foreach()

您需要取消foreach后最后一个$item2的设置:

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

这很有趣,似乎数组的行为与php中的对象相同,其中new array仍然保留成员标识符的副本(该标识符指向与其复制的数组相同的值)。

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

PHP手册-对象和引用

即使你没有传递$arr作为引用变量,你仍然在函数test()中访问$arr元素作为引用。因此,函数内部的任何变化也会影响外部函数。

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

中删除&