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.
为什么?如果函数返回一个引用,为什么我必须在函数调用之前使用引用运算符?
来自 PHP 文档
\n\nNote: 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.
http://php.net/manual/en/language.references.return.php
\n\n基本上,它是为了帮助 php 解释器。函数定义中的第一个用途是返回引用,第二个用途是通过引用而不是值绑定到赋值。
\n\n通过将 放在&函数声明中,函数将返回返回值的内存地址。除非另有明确说明,否则在获取此内存地址时,赋值会将值解释为 int,这就是&赋值运算符需要第二个的原因。
编辑:正如下面的 @ring\xc3\xb8 所指出的,它不返回内存地址,而是返回一个被视为副本的对象(技术上是写时复制)。
\n