【问题标题】:Using $this in method called with call_user_func_array在使用 call_user_func_array 调用的方法中使用 $this
【发布时间】:2012-10-04 20:34:05
【问题描述】:

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

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

【问题讨论】:

    标签: php arrays oop


    【解决方案1】:

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

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

    请参阅 http://php.net/manual/en/language.types.callable.php 了解各种可调用对象的列表。


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

    【讨论】:

    • 为了记录,他的代码中有第二个错误,从他对bar的定义来看,array('id' => 1)应该是array(1)
    • 哈!早该看到的,没想到这么简单。万分感谢!关于您的编辑:这是一个错字,在 SO-ask 窗口中编写了该代码:-)。再次感谢!
    【解决方案2】:

    你也可以这样做:

    (new $className())->$methodName(...$arrayWithParams)
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2016-05-26
      • 2020-03-02
      • 1970-01-01
      相关资源
      最近更新 更多