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

Oli*_*ons 17 php var

有什么区别

foreach ($my_array as $my_value) {
}
Run Code Online (Sandbox Code Playgroud)

和:

foreach ($my_array as &$my_value) {
}
Run Code Online (Sandbox Code Playgroud)

我可以请你给我两个真实世界的例子,说明何时使用另一个以及何时使用另一个?

Sam*_*son 23

第一个示例创建值的副本,而第二个示例使用对原始值的引用.所以在第一次foreach运行之后,原始数组仍未被触及.在第二个之后foreach,原始数组可能已被修改,因为它是通过引用处理的.

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

$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled
Run Code Online (Sandbox Code Playgroud)

它起作用,因为它通过引用与数组一起工作,而不是创建它的副本.

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

$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized
Run Code Online (Sandbox Code Playgroud)

请参阅按引用传递.

  • 如果$ my_value是一个对象,它不可避免地通过引用传递. (2认同)

Fel*_*ing 6

乔纳森的答案很好地描述了它.为了完整起见,这是你的两个例子:

  1. 只是阅读价值观:

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

    foreach ($my_array as &$my_value) {
        $my_value += 42;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果您不使用&$my_value,则添加不会产生任何影响$my_array.但你可以编写相同的不使用引用:

    foreach($my_array as $key=>$value) {
        $my_array[$key] = $value + 42;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

DEMO