使用
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 );
您看,PHP 中的对象变量仅仅是对象的
contents的
reference --- 因此,如果您将对象传递给函数,该函数对对象的 content 所做的任何更改也将反映在调用函数可以访问的内容中。 只要确保调用函数永远不会对对象变量本身
进行赋值,否则将导致函数基本上失去引用。函数所做的任何赋值语句都必须严格地到对象的内容。
是的,这是可能的,但你必须直接调用该函数。不要使用
<?php
function toBeCalled( &$parameter ) {
//...Do Something...
}
$changingVar = 'passThis';
toBeCalled($changingVar);
如果您有参数列表,则可以使用展开运算符(从 PHP 5.6 开始可用):$parameters = array( $changingVar );
toBeCalled(...$parameters);
如果您仍然需要在旧版本的 PHP 上执行代码,则必须使用其他答案中的技巧。
这是通过双重引用起作用的,当$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不幸的是,据我所知,似乎没有任何其他选择。