通过引用传递参数

函数参数可以通过 By Reference 传递,允许函数修改函数外部使用的变量:

function pluralize(&$word)
{
    if (substr($word, -1) == 'y') {
        $word = substr($word, 0, -1) . 'ies';
    } else {
      $word .= 's';
    }
}

$word = 'Bannana';
pluralize($word);

print $word;
  // Bannanas

对象参数始终通过引用传递:

function addOneDay($date)
{
    $date->modify('+1 day');
}

$date = new DateTime('2014-02-28');
addOneDay($date);

print $date->format('Y-m-d');
  // 2014-03-01

为了避免通过引用隐式传递对象,你应该知道对象。

通过引用传递也可以用作返回参数的替代方法。例如,socket_getpeername 功能:

bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )

此方法实际上旨在返回对等体的地址和端口,但由于有两个值要返回,因此它选择使用引用参数。它可以像这样调用:

if(!socket_getpeername($socket, $address, $port)) {
    throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";

变量 $address$port 不需要先定义。他们将:

  1. 首先被定义为 null
  2. 然后传递给具有预定义 null 值的函数
  3. 然后在函数中修改
  4. 最终定义为调用上下文中的地址和端口。