我无法找到这种行为的解释。
对于上下文,我正在使用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
的参数调用而不是将函数的结果赋给另一个变量时,我仍然不确定为什么会这样。如果有人对这些方面有任何见解,那就太棒了。
答案 0 :(得分:1)
这是因为PHP分配会创建一个副本。 IOW,它是按价值分配的。请参阅有关Assignment。
的手册尝试
$ref_params = &$obj->returnReferenceArray($bind_params);
获取对引用数组的引用(我没有试过这个......所以请告诉我们是否有效)。