__call方法需要知道何时通过引用或值传递var

时间:2010-12-16 15:20:52

标签: php

我有一个使用魔法 __ call 方法调用不同对象上方法的对象。

有时,此方法将用于调用需要其一个或多个参数作为参考的方法。

从php 5.3开始,call-time pass-by-reference已被弃用,所以我不能依赖于通过引用传递参数。我需要预测参数是否需要通过引用或值传递!

我将尝试在代码中解释这一点。我有以下两个类:

  • Main_Object
  • Extension_Object

注意:两个类之间没有继承结构。

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);

2 个答案:

答案 0 :(得分:1)

你可以设置allow_call_time_pass_reference = 1;但这远不是一个好的解决方案。似乎没有另一种方式。反思可能会产生答案,但我个人对这一特定问题的了解不足以真正建议......

Is it possible to pass parameters by reference using call_user_func_array()?

PHP: call_user_func_array: pass by reference issue

答案 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);
}