是否可以存储动态调用的函数的引用,该函数*在PHP 5中通过引用返回*?

时间:2016-01-24 06:00:53

标签: php reference

在PHP 5中,有没有办法动态(即通过使用call_user_funcReflectionFunction::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);

1 个答案:

答案 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已经过去了。