是否可以使用call_user_func_array()通过引用传递参数?

问题描述 投票:0回答:5

使用

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

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

$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );
php reference callback
5个回答
57
投票

要使用

call_user_func_array()
进行引用传递,数组中的参数必须是引用 - 是否通过引用传递与函数定义无关。 例如,这会起作用:

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

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

请参阅

call_user_func_array()
函数文档上的注释了解更多信息。


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 中的对象变量仅仅是对象的
contents

reference --- 因此,如果您将对象传递给函数,该函数对对象的 content 所做的任何更改也将反映在调用函数可以访问的内容中。 只要确保调用函数永远不会对对象变量本身

进行赋值,否则将导致函数基本上

失去引用。函数所做的任何赋值语句都必须严格地到对象的内容

是的,这是可能的,但你必须直接调用该函数。不要使用

0
投票

<?php

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

$changingVar = 'passThis';

toBeCalled($changingVar);

如果您有参数列表,则可以使用展开运算符(从 PHP 5.6 开始可用):
$parameters = array( $changingVar );
toBeCalled(...$parameters);

如果您仍然需要在旧版本的 PHP 上执行代码,则必须使用其他答案中的技巧。
    

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

-1
投票
$a = 2; $a = toBeCalled($a); echo $a //50 function toBeCalled( &$par_ref ) { $parameter = &$par_ref; $parameter = $parameter*25; }

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

-3
投票

警告:调用时传递引用已被弃用;如果您想通过引用传递它,请修改运行时函数名称的声明。如果您想启用调用时间按引用传递,您可以在...

中的 INI 文件中将allow_call_time_pass_reference 设置为 true

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

© www.soinside.com 2019 - 2024. All rights reserved.