当使用call_user_func_array()
时,我想通过引用传递参数。我该怎么做?例如:
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
call_user_func_array()
进行引用传递,数组中的参数必须是一个引用 - 它不取决于函数定义是否通过引用传递。例如,以下代码可以正常工作:function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
$parameters = array( &$changingVar );
call_user_func_array( 'toBeCalled', $parameters );
call_user_func_array()
函数文档的注释,以获取更多信息。直接来说,这可能是不可能的 - 然而,如果您对您正在实现的功能以及调用它的代码都有控制权,则有一种解决方法,您可能会发现适合。
您是否愿意将问题变量嵌入到对象中? 如果这样做,代码看起来(有点)像这样。
function toBeCalled( $par_ref ) {
$parameter = $par_ref->parameter;
//...Do Something...
$par_ref->parameter = $parameter;
}
$changingVar = 'passThis';
$parembed = new stdClass; // Creates an empty object
$parembed->parameter = array( $changingVar );
call_user_func_array( 'toBeCalled', $parembed );
这是通过双重引用实现的,当修改$parameter变量时,原始变量也会被修改。
$a = 2;
$a = toBeCalled($a);
echo $a //50
function toBeCalled( &$par_ref ) {
$parameter = &$par_ref;
$parameter = $parameter*25;
}
除非您在此处使用已弃用的功能。这将在PHP5中生成警告,使其不完美。
警告:调用时传递引用已被弃用;如果您想按引用传递它,请修改运行时函数名称的声明。如果您想启用调用时传递引用,可以在INI文件中将allow_call_time_pass_reference设置为true...
不幸的是,据我所知,似乎没有其他选择。
$parameters[0] =& $changingVar
。因此,这不是调用时传递引用 - 传递引用在方法签名中指定。 - Steven Oxleyarray()
不是一个函数。从PHP 5.5开始,在数组中放置引用是非常正常的。 - Zenexernew
已被弃用,因此 $foo =& new ReferenceObject
不再允许。 - kaiser
call_user_func("function", &$parameter)
时,会收到“Deprecated”(不建议使用)的消息。当我改用call_user_func_array
后,问题得到解决。因此,我启用了STRICT模式并且仍然没有收到消息,所以我认为这是一种可接受的方法。 - Lightbulb1