Php 如何调用类内成员变量的uuu invoke方法

Php 如何调用类内成员变量的uuu invoke方法,php,function,invoke,member,functor,Php,Function,Invoke,Member,Functor,PHP5.4.5,这里。我试图调用一个对象,该对象存储为其他对象的成员。像这样(非常粗略) 然后我得到一个语法错误 当然,我会写作 $this->a->__invoke(); 但这看起来丑陋得令人无法忍受,反而削弱了函子的重要性。我只是想知道是否有更好的(或官方的)方法。有三种方法: 直接调用\uuu invoke,您已经提到: $this->a->__invoke(); 通过给变量赋值: $a = $this->a; $a(); 通过使用调用用户函数: ca

PHP5.4.5,这里。我试图调用一个对象,该对象存储为其他对象的成员。像这样(非常粗略)

然后我得到一个语法错误

当然,我会写作

$this->a->__invoke();
但这看起来丑陋得令人无法忍受,反而削弱了函子的重要性。我只是想知道是否有更好的(或官方的)方法。

有三种方法:

直接调用
\uuu invoke
,您已经提到:

$this->a->__invoke();
通过给变量赋值:

$a = $this->a;
$a();
通过使用
调用用户函数

call_user_func($this->a);

最后一个可能就是你要找的。它的优点是可以处理任何可调用的对象。

我知道这是一个迟来的答案,但在父类中使用_call()和在子类中使用_invoke()的组合:

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");

PHP7+括号中关于对象内部回调的提示现在可以工作了:

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!

谢谢你,伊戈尔。在这三个变量中,对变量的赋值似乎是最清楚的,但没有一个是很好的。有人知道为什么“显而易见的”语法$this->a()找不到成员的_invoke方法吗?为什么成员访问与裸变量语法有根本的不同?因为它是不明确的
$this->a()
可以是方法
a
或成员
$a
。在PHP中,这两个元素被很强地分开(例如,与JS不同)。这是有道理的。谢谢。这是一个很好的方法。谢谢
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!