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

时间:2010-12-29 15:16:27

标签: php var

之间有什么区别
foreach ($my_array as $my_value) {
}

foreach ($my_array as &$my_value) {
}

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

5 个答案:

答案 0 :(得分:23)

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

某些本机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

请参阅Passing by Reference

答案 1 :(得分:5)

Jonathan's answers很好地描述了它。为了完整起见,这是你的两个例子:

  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]访问/更改原始值。

  3. DEMO

答案 2 :(得分:0)

当您使用&符号为变量添加前缀时,您将创建“引用”.PHP引用类似于计算机上的快捷方式或符号链接。您可以创建一个指针变量,它只是同一数据的另一个名称。

我没有看到使用它们的巨大差异,除了你不要复制变量保存内存。传递变量时,只需将引用和引用点传递给原始对象即可。

答案 3 :(得分:0)

&的现实世界的例子use是指当你需要用很少的代码行来改变数组的内容时

foreach($arrFeed as &$objFeed)
  $objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);

答案 4 :(得分:0)

我仅在必须读取csv文件以了解定界符时才使用引用。只需走第一行:

$handle = fopen($file, "r");
$firstLine = fgets($handle);
fclose($handle);

然后使用可能的分隔符

$delimiters = array(';' => 0,',' => 0,"\t" => 0,"|" => 0);

按引用数最常用的是

foreach ($delimiters as $delimiter => &$count) {
    $count = count(str_getcsv($firstLine, $delimiter));
}
$delimiter =  array_search(max($delimiters), $delimiters);