使用call_user_func_array()函数可以通过引用传递参数吗?

48

当使用call_user_func_array()时,我想通过引用传递参数。我该怎么做?例如:

function toBeCalled( &$parameter ) {
    //...Do Something...
}

$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
4个回答

56
要使用call_user_func_array()进行引用传递,数组中的参数必须是一个引用 - 它不取决于函数定义是否通过引用传递。例如,以下代码可以正常工作:
function toBeCalled( &$parameter ) {
    //...Do Something...
}

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

请参阅有关call_user_func_array()函数文档的注释,以获取更多信息。

10
启用STRICT后,此解决方案会出现警告..."已弃用:在调用时通过引用传递参数已被弃用"。 - Archenoth
3
我不清楚php的更新版本,但在我的5.3.3服务器上,当我使用call_user_func("function", &$parameter)时,会收到“Deprecated”(不建议使用)的消息。当我改用call_user_func_array后,问题得到解决。因此,我启用了STRICT模式并且仍然没有收到消息,所以我认为这是一种可接受的方法。 - Lightbulb1
我进行了一项代码测试,它可以在PHP 4.3.0 - 7.4.0上正常工作,即使启用了STRICT模式。请查看https://3v4l.org/NJN2u以自行查看。 - Radon8472

1

直接来说,这可能是不可能的 - 然而,如果您对您正在实现的功能以及调用它的代码都有控制权,则有一种解决方法,您可能会发现适合。

您是否愿意将问题变量嵌入到对象中? 如果这样做,代码看起来(有点)像这样。

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中的对象变量仅仅是指向对象内容的一个引用——所以如果你将一个对象传递给一个函数,该函数对对象内容所做的任何更改都会反映在调用函数所能访问的内容中。
只要确保调用函数永远不会对对象变量本身进行赋值——否则这将导致函数基本上失去引用。函数所做的任何赋值语句必须严格限制于对象的内容。

0

这是通过双重引用实现的,当修改$parameter变量时,原始变量也会被修改。

$a = 2;
$a = toBeCalled($a);
echo $a //50

function toBeCalled( &$par_ref ) {
    $parameter = &$par_ref;
    $parameter = $parameter*25;
}

-2

除非您在此处使用已弃用的功能。这将在PHP5中生成警告,使其不完美。

警告:调用时传递引用已被弃用;如果您想按引用传递它,请修改运行时函数名称的声明。如果您想启用调用时传递引用,可以在INI文件中将allow_call_time_pass_reference设置为true...

不幸的是,据我所知,似乎没有其他选择。


6
我刚刚尝试使用PHP 5.2.9做了这件事,没有收到任何警告。我认为你可能会被array()不是真正的函数所困惑 - 在我的代码示例中,我基本上是在设置$parameters[0] =& $changingVar。因此,这不是调用时传递引用 - 传递引用在方法签名中指定。 - Steven Oxley
1
这仅适用于直接函数调用。array()不是一个函数。从PHP 5.5开始,在数组中放置引用是非常正常的。 - Zenexer
请记住,在 PHP 5.5(?)(版本)中,通过引用传递 new 已被弃用,因此 $foo =& new ReferenceObject 不再允许。 - kaiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接