PHP Magic __invoke 类的对象属性

Maz*_*Maz 3 php class invoke magic-methods chainability

考虑这个类的安排 - 特别是神奇函数 __invoke:

class Barman {  
    public function __construct() {
        // .. .constructor stuff - whatever
    }

    public function makeDrink() {
        return "vodka martini, shaken";
    }   
}

class Bar { 
    private $arr_barmen = array();

    public function __construct() {
        $this->arr_barmen['john'] = new Barman();
    }

   public function __invoke($barman_id) {
      echo "I have been invoked";
      return $this->arr_barmen[$barman_id];
   }

   public function aBarFunc($param) {
      return "yes it worked ," .$param;
   }
}

class Foo {

    public $myBar;

    public function __construct() {
        $this->myBar = new Bar();
    }

}
Run Code Online (Sandbox Code Playgroud)

我想写这样的语法

$company = new Foo();
$company->myBar('john')->makeDrink();
Run Code Online (Sandbox Code Playgroud)

首选结果:“伏特加马提尼,摇匀”

实际结果:
“调用未定义的方法 Foo::myBar()”

使用 magic 方法调用 myBar() 应该返回一个调酒师对象,您可以在该对象上调用调酒师的任何公共方法

但现在考虑一下这个(确实有效)

$company = new Foo();
$myBar = $company->myBar;
$drink = $myBar('john')->makeDrink();
echo $drink;

// Result:
// I have been invoked 
// vodka martini, shaken
Run Code Online (Sandbox Code Playgroud)

发生什么了?我不喜欢这种解决方法——它不时尚。我需要它以这种方式工作:

$company->myBar('john')->makeDrink();

请帮忙?:-)

tma*_*mas 5

我相信你可以在它周围添加大括号:

$company = new Foo();
$drink = ($company->myBar)('john')->makeDrink();
echo $drink; // vodka martini, shaken
Run Code Online (Sandbox Code Playgroud)