代码之家  ›  专栏  ›  技术社区  ›  alex

PHP中foreach循环中的按引用传递迭代器有什么优点?

  •  2
  • alex  · 技术社区  · 15 年前

    我刚读到这个 answer by Bill Karwin .

    请注意 $node 是通过引用传递的。

    我一直认为在那里创建的变量只是临时的,并且只存在到循环结束(或者可能它仍然设置为最后一次迭代-我没有测试它)。

    那么,让它通过引用有什么好处呢?

    我肯定有一个,但我还没弄清楚。

    2 回复  |  直到 8 年前
        1
  •  6
  •   Bill Karwin    15 年前

    这与更快更高效无关。

    PHP实现了写时复制,因此变量可以引用相同的内存区域 直到 你改变了它的价值。然后,当您更改变量时,PHP将根据您是通过值还是通过引用来访问它来决定是否创建副本。

    按值访问--对变量的更改将创建一个副本:

    $a = array("abc");
    
    foreach ($a as $element) {
      $element = "def";
    }
    
    print_r($a);
    
    Array
    (
        [0] => abc
    )
    

    通过引用访问--对变量的更改会影响原始副本:

    foreach ($a as &$element) {
      $element = "def";
    }
    
    print_r($a);
    
    Array
    (
        [0] => def
    )
    

    没有 使用 &
    这是使用对象的好理由!

    在PHP中使用引用时要非常小心,因为它们可能会产生混乱的效果。

    请务必阅读以下博客: Do not use PHP references PHP核心开发人员Johannes Schlter

        2
  •  2
  •   deceze    15 年前

    foreach ($array as $key => $node) {
        $array[$key]['foo'] = 'bar';
    }
    

    可以像这样缩短和提高效率:

    foreach ($array as &$node) {
        $node['foo'] = 'bar';
    }
    

    在这种情况下 $node 不是数组项内容的副本,而是对实际数组项的引用;不管你对它做什么,你都对数组做什么。

    推荐文章