【发布时间】:2011-04-07 22:05:44
【问题描述】:
当我尝试通过引用调用带有参数的函数时它会触发
function test(&$a) ...
通过
call_user_func('test', $b);
【问题讨论】:
标签: php
当我尝试通过引用调用带有参数的函数时它会触发
function test(&$a) ...
通过
call_user_func('test', $b);
【问题讨论】:
标签: php
call_user_func 只能按值传递参数,不能按引用传递。如果你想通过引用传递,你需要直接调用函数,或者使用call_user_func_array,它接受引用(但是这可能在PHP 5.3及更高版本中不起作用,取决于手册的哪一部分)。
【讨论】:
ReflectionMethod 类似:invoke 不起作用,而 invokeArgs 确实通过了引用。
来自call_user_func()的手册
注意 call_user_func() 的参数不是通过引用传递的。
所以,是的,这就是你的答案。不过,有办法绕过它,再次阅读manual
call_user_func_array('test', array(&$b));
应该可以通过引用传递。
【讨论】:
我刚刚遇到了同样的问题,正在改变(就我而言):
$result = call_user_func($this->_eventHandler[$handlerName][$i], $this, $event);
到
$result = call_user_func($this->_eventHandler[$handlerName][$i], &$this, &$event);
似乎在 php 5.3 中工作得很好。
我认为这甚至不是一种解决方法,它只是在做被告知的事情:-)
【讨论】:
你需要设置变量等于函数的结果,像这样...
$b = call_user_func('test', $b);
而函数应该写成如下...
function test($a) {
...
return $a
}
不推荐使用其他按参考传递的工作。
【讨论】:
您可以考虑在“使用”声明中包含一个引用变量的闭包概念。例如:
$note = 'before';
$cbl = function( $msg ) use ( &$note )
{
echo "Inside callable with $note and $msg\n";
$note = "$msg has been noted";
};
call_user_func( $cbl, 'after' );
echo "$note\n";
解决您的原始问题的一些方法,但如果您有一个需要通过引用调用的函数,您可以在其周围包装一个可调用闭包,然后通过 call_user_func() 执行该闭包。
【讨论】: