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();
请帮忙?:-)
我相信你可以在它周围添加大括号:
$company = new Foo();
$drink = ($company->myBar)('john')->makeDrink();
echo $drink; // vodka martini, shaken
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1951 次 |
| 最近记录: |