如何调用成员变量的方法__invoke类的内部(How to call the __invoke m

2019-09-23 01:02发布

PHP 5.4.5,在这里。 我试图调用被存储为一些其他对象的成员的对象。 像这样(非常粗略地)

class A {
    function __invoke () { ... }
}

class B {
    private a = new A();
 ...
    $this->a();  <-- runtime error here
}

这将产生一个运行时错误,当然,因为没有所谓的方法。 但是,如果我写这样的电话:

($this->a)();

然后我得到一个语法错误。

当然,我可以写

$this->a->__invoke();

但似乎难以忍受的丑陋,而破坏函子的地步。 我只是想知道是否有一个更好的(或官员)的方式。

Answer 1:

有三种方式:

直接调用__invoke ,您已经提到:

$this->a->__invoke();

通过分配给一个变量:

$a = $this->a;
$a();

通过使用call_user_func

call_user_func($this->a);

最后一种可能是你在找什么。 它有它的工作原理与任何可调用的好处。



Answer 2:

我知道这是一个迟到的回答,而是用在子类中的父母和__invoke()__call()的组合:

class A {
  function __invoke ($msg) {
    print $msg;
  }
}

class B {
    private $a;

    public function __construct() { $this->a = new A(); }

    function __call($name, $args)
    {
      if (property_exists($this, $name))
      {
        $prop = $this->$name;
        if (is_callable($prop))
        {
          return call_user_func_array($prop, $args);
        }
      }
    }
}

然后,你应该能够实现你正在寻找的语法糖:

$b = new B();
$b->a("Hello World\n");


Answer 3:

FYI在PHP 7+周围物体内的回调括号现在的工作:

class foo {                                                                     
    public function __construct() {                                             
        $this -> bar = function() {                                             
            echo "bar!" . PHP_EOL;                                              
        };                                                                      
    }                                                                           

    public function __invoke() {                                                
        echo "invoke!" . PHP_EOL;                                               
    }                                                                           
}                                                                               

(new foo)();                                                                    

$f = new foo;                                                                   
($f -> bar)(); 

结果:

invoke!
bar!


文章来源: How to call the __invoke method of a member variable inside a class