【发布时间】:2016-04-28 04:23:09
【问题描述】:
设置
我从一个开源 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];
}
这个函数会被这样调用:
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;
}
这个想法是,一旦我调用static_storage,返回的值将随着静态存储的变化而更新。
问题
我的兴趣在于$object = &staticStorage('object_' . $object_id); 这一行,注意函数前面的&。 staticStorage 函数已经返回一个引用,所以我最初没有在函数调用之前包含引用运算符。但是,如果没有函数调用之前的引用,它就不能正常工作。
我对指针的理解是,如果我返回一个指针,php 会自动将变量转换为指针$a = &$b 会导致$a 指向$b 的值。
问题
为什么?如果函数返回一个引用,为什么我必须在函数调用之前使用引用运算符?
【问题讨论】:
标签: php pointers pass-by-reference