在PHP 5中,有没有办法动态(即通过使用call_user_func
或ReflectionFunction::invoke()
)调用返回的函数通过引用,并存储它返回的引用,而不引发通知/警告/错误,并且不使用错误控制操作符(@
)?
我不引用通过引用传递。 Returning by reference是一个完全不同的主题。
举例说明:
$a = (object) array();
$callback = function & () use (&$a) {
return $a;
};
// no problems, and sure enough $b === $a
$b = &$callback();
// emits "Strict Standards: Only variables should be assigned by reference"
// but still $b === $a anyway
$b = &call_user_func($callback);
答案 0 :(得分:1)
似乎无法让call_user_func()
在PHP 5.x中返回引用。但是,根据PHP版本,可能会有一些解决方法。
一种方法似乎有效:
$b = &$callback();
正如我们在评论中所讨论的,当我们必须使用配置/可变数量的参数调用$callback()
时,这会出现问题。如果我们有PHP 5.6,那么有一个变通方法,...
(splat) operator:
$b = &$callback(...$argArray);
这将按顺序解包$argArray
中包含的参数,并将它们作为函数参数传递给$callback()
。
不幸的是,这只适用于PHP 5.6 +。
在PHP 5.6之前,你可能会使用类似的东西(未经测试):
$argsToEval = array_map(function($key) {
return '$argArray[' . $key . ']';
}, array_keys($argArray));
$code = sprintf('$b = &$callback(%s);', implode(', ', $argsToEval);
eval($code);
我们都同意这是混乱的。但是,根据PHP版本,可能会使用不同的语法,因为您表示需要支持5.3+。我还鼓励你放弃5.3和5.4的支持,因为5.3在2013年3月达到了生命终结,并且在2015年9月达到了5.4生命终结.5.5将在今年6月达到生命终结。但是,我确实意识到一些用户能够升级的实用性,即使EoL已经过去了。