如何调用类中成员变量的 __invoke 方法

2022-08-30 21:52:40

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

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

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

当然,这会产生运行时错误,因为没有称为 a 的方法。但是如果我这样写电话:

($this->a)();

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

当然,我可以写

$this->a->__invoke();

但这似乎令人无法忍受的丑陋,反而破坏了函子的意义。我只是想知道是否有更好(或官方)的方法。


答案 1

有三种方法:

直接呼叫 ,您已经提到过:__invoke

$this->a->__invoke();

通过赋值到变量:

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

通过使用 :call_user_func

call_user_func($this->a);

最后一个可能是你正在寻找的。它的好处是它可以与任何可调用的一起使用。


答案 2

PHP 7+ 中的 FYI 对象内部回调周围的括号现在有效:

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!

推荐