将额外(链式)方法调用捕获到__get()魔术方法中

时间:2016-02-26 00:36:42

标签: php

我对这个没有寄予厚望:

如果某个服务的行为与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(),那么洞察力将会受到赞赏

2 个答案:

答案 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;
}