2008-11-17 139 views

回答

45

要通过使用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 documentation的注释。

+7

这个方案投以严格的能...警告“不推荐使用:通话时传递的引用已被弃用” – Archenoth 2013-03-17 20:51:37

+3

我不知道PHP的,但我的5.3.3服务器上的新版本当我使用`call_user_func(“函数”,&$参数)`我得到了弃用的消息。当我切换到`call_user_func_array`时,它解决了这个问题。所以然后我检查了STRICT启用,仍然没有得到消息,所以我认为这是一个可以接受的方式来做到这一点。 – Lightbulb1 2014-07-11 15:51:09

-2

除了您在此处使用不建议使用的功能。您将在PHP5中生成警告,使其不够完美。

警告:不推荐使用通过引用的呼叫时间;如果您想通过引用来传递它,请修改运行时函数名称的声明。如果你想启用呼叫时间通过引用,你可以设置allow_call_time_pass_reference为真在你的INI文件中...

不幸的是,似乎没有任何其他选项,我可以发现。

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; 
} 
相关问题