【问题标题】:Passing by reference assignment php [duplicate]通过引用分配php传递[重复]
【发布时间】:2015-07-11 10:53:51
【问题描述】:

根据下面的php代码,输出是

1 . 1 
2 . 2 
3 . 3 

我知道 &$ref 是通过引用传递的。但是就像在赋值($row = &$ref;) 之后,每当'row' 改变值时,'ref' 也会改变为与'row' 相同的值。真的很混乱。似乎 = 不仅将正确的值分配给左侧。有人可以验证一下吗?

<?php
$ref = 0;
$row = &$ref;
foreach (array(1, 2, 3) as $row) {
    print "$row . $ref \n" ;
}
echo $ref; 
?>

【问题讨论】:

标签: php


【解决方案1】:

当你做$row = &amp;$ref;

意思是:同一个变量内容不同的名字。也就是说,一样的,不是副本。你在$ref 中所做的,它将在$row 中进行......反之亦然。

【讨论】:

    【解决方案2】:

    无需过多研究technical details,这里的基本思想是您已将$ref 引用为$row。具体来说,$row 位于某个内存地址。如果你做一个简单的作业

    $ref = $row;
    

    那么$ref$row副本。如果你改变了一个,它不会改变另一个

    $row = &$ref;
    

    $ref 现在指向$row。所以它们本质上是同一个变量。它们指向相同的内存位置(过于简单,所以你明白了)。

    最常见的用途是您需要将一些值注入到函数中。

    $data = ['1', '2', '3'];
    
    function modVal(Array &$arr) {
        $arr[2] = '9';
    }
    modVal($data);
    var_dump($data);
    

    生产

    array(3) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "9"
    }
    

    然而,从函数声明中删除&amp;,输出变为

    array(3) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
    }
    

    PHP 有时会自动为您传递引用。例如,如果您实例化一个类并将该实例注入到函数中,它将自动通过引用传递。

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 2011-03-19
      • 2020-12-06
      • 2017-08-12
      • 1970-01-01
      • 2013-11-21
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多