gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:56:34 24 4
gpt4 key购买 nike

设置

我正在从我经常用于自定义项目的开源 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文档

注意:与参数传递不同,这里你必须在两个地方都使用 & - 表示你想通过引用返回,而不是副本,并表示引用绑定(bind),而不是通常的赋值,应该是为 $myValue 完成。

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

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

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

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

关于php - 为什么我必须在函数调用中使用引用运算符 (&)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34931957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com