【问题标题】:Can we pass the parameter array by reference to call_user_func_array() instead of passing an array of variable references?我们可以通过引用 call_user_func_array() 来传递参数数组,而不是传递变量引用数组吗?
【发布时间】:2012-02-10 11:07:17
【问题描述】:

我查看了Is it possible to pass parameters by reference using call_user_func_array()?http://php.net/manual/en/function.call-user-func-array.php。使用 call_user_func_array() 通过引用传递的批准技术似乎是通过使参数数组成为变量引用的数组。例如,设置$parameters = array( &$some_variable)。我的问题是,我们是否可以将参数数组改为变量数组(不是引用),并将整个参数数组作为引用传递?如下图所示:

function toBeCalled( &$parameter1, $parameter2 ) {
    //...Do Something...
}

$changingVar = 'passThis';
$changingVar2 = 'passThisToo';
$parameters = array( $changingVar, $changingVar2 );
call_user_func_array( 'toBeCalled', &$parameters );

请注意,toBeCalled 函数期望第一个变量作为引用,第二个变量作为值。我问的原因是因为这里的语法很方便,而且似乎可以工作(请参阅这个 PHP 5.3 补丁,了解 Drupal 的 DruTex 模块 - http://drupal.org/node/730940#comment-4054054),但我只是在检查专家的想法。

【问题讨论】:

  • 使用第一个版本,因为它有效。后者甚至不适用于 PHP 5.3(或者您的示例对您有用吗?),并且无论如何都将被 PHP 5.4 禁止(用于强制传递引用的 Zend memleaks)。

标签: php parameter-passing pass-by-reference


【解决方案1】:

你不能,因为当你把东西放入数组而不是通过引用时,它们就会被复制。因此,无论您之后对数组做什么,它都不会影响您放入的原始变量(如果它们甚至是开始的变量)。

您链接的内容似乎不相关。它正在删除毫无意义的调用时传递引用。

【讨论】:

  • 感谢@newacct,您关于将事物复制到数组中的观点有助于清楚为什么 call_user_func_array 需要具有引用的元素(乍一看似乎违反了对调用时间传递的限制-参考)。测试后:<?php function toCall(&$var1, $var2) { var_dump(func_get_args()); $var1 = $var1 * 5; $var2 = $var2 + 1; } $x1 = 4; $x2 = 5; $params = array(); $params[] = $x1; $params[] = $x2; call_user_func_array('toCall', &$params); echo('<br />' . $x1); echo('<br />' . $x2); ?> 返回错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2011-08-09
相关资源
最近更新 更多