9

我有一个方法,简化如下:

class Foo {

   public function bar($id) {
      // do stuff using $this, error occurs here
   }

}

像这样称呼它效果很好:

$foo = new Foo();
$foo->bar(1);

但是,如果我使用 调用它call_user_func_array(),如下所示:

call_user_func_array(array("Foo", "bar"), array('id' => 1));

应该相等我收到以下错误:

致命错误:不在对象上下文中时使用 $this

$this未定义)

为什么是这样?有什么我想念的吗?我应该如何做到这一点,以便我仍然可以$this在被调用的方法中使用?

4

2 回答 2

14

array("Foo", "bar")等于Foo::bar(),即一个静态方法 - 这是有道理的,因为$foo它没有在任何地方使用,因此 PHP无法知道要使用哪个实例。

你想要的是array($foo, "bar")调用实例方法。

有关各种可调用对象的列表,请参见http://php.net/manual/en/language.types.callable.php


您还需要将参数作为索引数组而不是关联数组传递,即array(1)而不是array('id' => 1)

于 2012-10-14T19:58:00.047 回答
0

您可以使用以下方法执行相同操作:

(new $className())->$methodName(...$arrayWithParams)
于 2021-02-27T18:25:43.067 回答