Php:$var和&$var有什么区别?

2022-08-30 18:26:54

两者之间有什么区别

foreach ($my_array as $my_value) {
}

和:

foreach ($my_array as &$my_value) {
}

?

我能请你给我两个现实世界的例子,说明何时使用一个,何时使用另一个?


答案 1

第一个示例创建值的副本,而第二个示例使用对原始值的引用。因此,在第一次运行之后,原始数组仍未受影响。在第二个之后,原始数组可以被修改,因为它是通过引用处理的。foreachforeach

一些原生 PHP 函数已经以这种方式工作,例如 shuffle() 它重新排列数组的内容。您会注意到此函数不返回数组,只需调用它:

$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled

它发挥了它的魔力,因为它通过引用而不是创建数组的副本来处理数组。

然后,有些函数不通过引用传递任何内容,而是处理原始值的副本,例如返回新结果字符串的ucwords():

$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized

请参见通过引用传递


答案 2

乔纳森的回答很好地描述了这一点。为了完整起见,这里有两个例子:

  1. 只需读取值:

    $my_array = range(0,3);
    foreach ($my_array as $my_value) {
        echo $my_value . PHP_EOL;
    }
    
  2. 向每个元素添加一些数字(从而修改每个值):

    foreach ($my_array as &$my_value) {
        $my_value += 42;
    }
    

    如果不使用 ,则添加不会对 产生任何影响。但是你可以写同样的东西,不使用引用:&$my_value$my_array

    foreach($my_array as $key=>$value) {
        $my_array[$key] = $value + 42;
    }
    

    不同之处在于,我们直接使用 访问/更改原始值。$my_array[$key]

演示


推荐