通过参考传递

这允许你通过引用传递变量来允许你修改原始变量的函数或元素。

传递引用不仅限于变量,以下内容也可以通过引用传递:

  • 新的陈述,例如 foo(new SomeClass)
  • 从函数返回的引用

数组

传递引用 的常见用法是修改数组中的初始值,而不是创建新数组或乱丢命名空间。通过引用传递就像使用 & => &$myElement 在变量前面/前缀一样简单。

下面是一个从数组中利用元素并简单地将 1 添加到其初始值的示例。

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

现在,当你利用 $arr 中的任何元素时,原始元素将随着引用的增加而更新。你可以通过以下方式验证:

print_r($arr);

注意

在循环中利用引用传递时应注意。在上面的循环结束时,$num 仍然保持对数组的最后一个元素的引用。分配后循环将最终操作最后一个数组元素! 你可以确保这不会发生在环路后的时候:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

以上将确保你不会遇到任何问题。 StackOverflow 上的这个问题中提供了与此相关的问题示例。

功能

传递引用的另一种常见用法是在函数内。修改原始变量非常简单:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

这可以通过 echo‘ing 原始变量来验证。

echo $var;

有关函数的各种限制,如下面的 PHP 文档中所述:

注意: 函数调用上没有引用符号 - 仅在函数定义上。单独的函数定义足以通过引用正确传递参数。从 PHP 5.3.0 开始,当你在 foo(&$ a);中使用&时,你将收到一条警告,指出“call-time pass-by-reference”已弃用。从 PHP 5.4.0 开始,删除了调用时传递引用,因此使用它会引发致命错误。