PHP 5.4.5,在这里。 我试图调用被存储为一些其他对象的成员的对象。 像这样(非常粗略地)
class A {
function __invoke () { ... }
}
class B {
private a = new A();
...
$this->a(); <-- runtime error here
}
这将产生一个运行时错误,当然,因为没有所谓的方法。 但是,如果我写这样的电话:
($this->a)();
然后我得到一个语法错误。
当然,我可以写
$this->a->__invoke();
但似乎难以忍受的丑陋,而破坏函子的地步。 我只是想知道是否有一个更好的(或官员)的方式。
有三种方式:
直接调用__invoke
,您已经提到:
$this->a->__invoke();
通过分配给一个变量:
$a = $this->a;
$a();
通过使用call_user_func
:
call_user_func($this->a);
最后一种可能是你在找什么。 它有它的工作原理与任何可调用的好处。
我知道这是一个迟到的回答,而是用在子类中的父母和__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");
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!