分配引用数组

时间:2014-09-06 22:02:32

标签: php arrays reference

我无法找到这种行为的解释。

对于上下文,我正在使用call_user_func_array函数为准备好的SQL语句动态绑定参数。我创建了一个简单的函数,它接受一个数组,然后返回一个对该数组值的引用数组:

public function returnReferenceArray($array)
{
    foreach(array_keys($array) as $value)
    {
        $refs[] = &$array[$value];
    }

    return $refs;
}

直接将其作为call_user_func_array函数的参数调用时就可以正常工作,如下所示:

call_user_func_array(array($stmt, "bind_param"),  $obj->returnReferenceArray($bind_params));

但是,在将返回的数组赋值给变量时,行为是不同的,如下所示:

$ref_params = $obj->returnReferenceArray($bind_params);

call_user_func_array(array($stmt, "bind_param"),  $ref_params);

我收到了这个警告:

警告:参数2到mysqli_stmt :: bind_param()应该是一个参考,给定值

我不一定有问题需要解决;我只想弄清楚为什么PHP在分配和返回时以这种方式处理引用数组。


更多研究更新

为了更简单地测试这种行为,我通过一系列测试运行了几个数组,以确定在什么情况下维护数组中包含的引用,并且似乎使用函数插入引用根本不起作用。这是我的简化测试:

function returnReferenceArray($array)
{
    foreach(array_keys($array) as $value)
    {
        $refs[] = &$array[$value];
    }

    return $refs;
}

function referenceReferenceArray($varray, &$rarray)
{
    foreach(array_keys($varray) as $value)
    {
        $rarray[] = &$varray[$value];
    }
}

$value_array = array(
    "foo" => 1,
);

$ref_array[] = &$value_array["foo"]; //reference is maintained

$ref_array = array();
$ref_array = returnReferenceArray($value_array); //reference is NOT maintained

$ref_array = array();
referenceReferenceArray($value_array, $ref_array); //reference is NOT maintained

这是一个带有输出的要点,用于演示行为:

https://gist.github.com/twistofreality/3b4760aba008f7620d10

所有这一切,必须保持某种引用,因为调用我的函数作为call_user_func_array的参数对bind_param有效,但是,鉴于我的测试结果,我和#39;我现在对定义引用数组行为的机制感到困惑。

我希望有人可以指出一些我忽视的明显事物。


另一个更新

看起来这是一个覆盖良好的领域。在发布之前我确实在SO上搜索了一段时间,但后来我在"相关的"中注意到了这一点。部分:

My PHP array of references is "magically" becoming an array of values... why?

无论如何,当我直接将函数作为call_user_func_array的参数调用而不是将函数的结果赋给另一个变量时,我仍然不确定为什么会这样。如果有人对这些方面有任何见解,那就太棒了。

1 个答案:

答案 0 :(得分:1)

这是因为PHP分配会创建一个副本。 IOW,它是按价值分配的。请参阅有关Assignment

的手册

尝试

$ref_params = &$obj->returnReferenceArray($bind_params);

获取对引用数组的引用(我没有试过这个......所以请告诉我们是否有效)。