我有一个使用魔法 __ call 方法调用不同对象上方法的对象。
有时,此方法将用于调用需要其一个或多个参数作为参考的方法。
从php 5.3开始,call-time pass-by-reference已被弃用,所以我不能依赖于通过引用传递参数。我需要预测参数是否需要通过引用或值传递!
我将尝试在代码中解释这一点。我有以下两个类:
注意:两个类之间没有继承结构。
class Main_Object {
public function __call($method, $arguments)
{
// check this method is in an extended class
// …
$ext = new Extension_Object();
// call method in extension object
return call_user_func_array(array($ext, $method), $arguments);
}
}
class Extension_Object {
// takes two arguments
public function foo($p1, $p2)
{
// ...
}
// takes two arguments, the first being a reference
public function bar(&$p1, $p2)
{
// ...
}
}
目前我无法找到一种方法来调用bar()而不会生成PHP错误或警告
$obj = new Main_Object();
// works as expected
$obj->foo($bacon, $cheese);
// MESSAGE call-time pass-by-reference has been deprecated
$obj->bar(&$bacon, $cheese);
// WARNING parameter 1 expected to be a reference
$obj->bar($bacon, $cheese);
答案 0 :(得分:1)
你可以设置allow_call_time_pass_reference = 1;但这远不是一个好的解决方案。似乎没有另一种方式。反思可能会产生答案,但我个人对这一特定问题的了解不足以真正建议......
Is it possible to pass parameters by reference using call_user_func_array()?
答案 1 :(得分:1)
你可以像这样手动转换参数。
public function __call($method, $arguments) {
$referenceable_arguments = array();
// Gets around a limitation in PHP.
foreach ($arguments as &$argument) {
$referenceable_arguments[] = &$argument;
}
return call_user_func_array(array($this->delegate, $method), $referenceable_arguments);
}