【问题标题】:PHP: strange reference variablePHP:奇怪的引用变量
【发布时间】:2015-09-25 21:09:13
【问题描述】:

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

但是当我运行这些测试代码时,它不会那样发生。 谁能解释一下我在这里想念什么?谢谢

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

【问题讨论】:

标签: php reference


【解决方案1】:

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

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

【讨论】:

  • 不是那么简单。如果我不运行这些行: foreach($arr as &$item2) { $item2 = 3;我将能够继续在 test() 中使用 &$item 并且 $arr 值没有改变(如预期的那样)。这是为什么? :)
【解决方案2】:

这很有趣,看起来数组的行为与 php 中的对象相同,其中新数组仍然保存成员标识符的副本(它指向与复制它的数组相同的值)。

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

PHP Manual - Objects and references

【讨论】:

    【解决方案3】:

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

    $value 的引用和最后一个数组元素即使在 foreach 循环。建议通过 unset() 销毁。

    参考:PHP foreach()

    您需要在 foreach 之后取消设置最后一个 $item2

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

    【讨论】:

    • 是的,通过 unset($item2);我们可以在这里解决这个问题,或者我们可以做一些其他的方法。但是我想知道为什么 $item2 会影响到 test(),尽管我没有将它传递给 test(),或者传递 $arr 的引用?
    • @TranHuynh 因为当您在 $arr 上运行测试时,您的测试会拾取最后一个“引用”$item
    • 感谢达伦,其实我现在很困惑。当我将 $arr 传递给 test() 时。没有参考,在 test() 中它被称为 $arr2 => 所以 $arr2 和 $arr 是相互独立的,对吧?这意味着 $arr 和 $arr2 是 2 个不同的变量。但是为什么 $arr 的最后一个引用(称为 $item2,在 test() 之外)可以通过 $arr2 的引用(称为 $item,在 test() 内部)来影响?
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2011-12-05
    • 2011-04-08
    相关资源
    最近更新 更多