我对这个没有寄予厚望:
如果某个服务的行为与foo
中的$service->foo->bar( $a, $b )
和$service
作为受保护属性的容器类一样,那么有没有办法使用__get()
在容器上访问服务并传递->bar( $a, $b )
?
class Container {
protected $service;
protected $responses = [];
public function __get ($name) {
$this->responses[] = $service->$name-> _???_
return $resp;
}
}
可以拦截,以便Container可以捕获操作,用它调用$service
,保存响应,然后返回响应
要么抓住$name
或$name
所包含的其他内容,要么抓住所有其他内容。我知道这有点令人费解,但它会帮我清理一些代码,而且我现在只是好奇。
如果重要的话,这个应用程序正在运行PHP7。
另外,如果 是一种方法,但它不是__get()
,那么洞察力将会受到赞赏
答案 0 :(得分:1)
bar
的调用是在__get
返回后发生的。 __get
由引擎调用,因此您无法添加其他参数。但是,您可以在容器类上创建其他方法以实现所需的功能。
假设我正确地理解了你的问题,这将导致类似这样的事情:
public function executeOnService(string $name, string $method, ...$args) {
return call_user_func_array([$this->service->$name, $method], $args);
}
答案 1 :(得分:0)
由于您已经期望Container
的使用者代码对此服务对象的属性有很多了解,或许您应该考虑返回消费代码想要对其执行操作的属性,例如:
public function __get ($name) {
return $service->$name;
}