为什么我必须在函数调用中使用引用运算符(&)?

dan*_*317 7 php pointers pass-by-reference

建立

我从一个我经常用于自定义项目的开源CMS借用一个函数.

它的目的对于这个问题并不重要,但如果你想知道它是一个简单的静态缓存,旨在减少数据库查询.我可以在一个页面加载中调用getObject 10次,而不必担心10次访问数据库.

该函数的简化版本如下所示:

function &staticStorage($name, $default_value = NULL)
{
  static $data = array();
  if (isset($data[$name])
  {
    return $data[$name];
  }
  $data[$name] = $default_value;
  return $data[$name];
}
Run Code Online (Sandbox Code Playgroud)

这个函数将被调用如下:

function getObject($object_id)
{
  $object = &staticStorage('object_' . $object_id);
  if ($object)
  {
    return $object;
  }

  // This query isn't accurate but that's ok it's not important to the question.
  $object = databaseQuery('SELECT * FROM Objects WHERE id = @object_id', 
                          array('@object_id => $object_id'));
  return $object;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,一旦我调用static_storage返回值将更新静态存储.

问题

我感兴趣的是$object = &staticStorage('object_' . $object_id);注意&功能前面的行.该staticStorage函数已经返回一个引用,所以我最初没有在函数调用之前包含引用运算符.但是,如果没有函数调用之前的引用,它将无法正常工作.

我对指针的理解是,如果我返回一个指针,php会自动将变量转换为指针$a = &$b将导致$a指向的值$b.

这个问题

为什么?如果函数返回一个引用,为什么我必须在函数调用之前使用引用运算符?

Sco*_*ott 2

来自 PHP 文档

\n\n

Note: Unlike parameter passing, here you have to use & in both places - to indicate that you want to return by reference, not a copy, and to indicate that reference binding, rather than usual assignment, should be done for $myValue.

\n\n

http://php.net/manual/en/language.references.return.php

\n\n

基本上,它是为了帮助 php 解释器。函数定义中的第一个用途是返回引用,第二个用途是通过引用而不是值绑定到赋值。

\n\n

通过将 放在&函数声明中,函数将返回返回值的内存地址。除非另有明确说明,否则在获取此内存地址时,赋值会将值解释为 int,这就是&赋值运算符需要第二个的原因。

\n\n

编辑:正如下面的 @ring\xc3\xb8 所指出的,它不返回内存地址,而是返回一个被视为副本的对象(技术上是写时复制)。

\n