代码之家  ›  专栏  ›  技术社区  ›  CJ Thompson

将额外(链式)方法调用抓取到__get()魔法方法中

php
  •  0
  • CJ Thompson  · 技术社区  · 8 年前

    我对这个不抱太大希望:

    给定一个具有类似于 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;
      }
    }
    

    它可以被拦截,以便容器可以捕获操作,调用 $服务 使用它,保存响应,然后返回响应

    无论是哪种方式,都可以抓住其他被锁住的东西 $name 或者如果 $名称 包括所有这些。我知道这有点复杂,但它会帮助我彻底清理一些代码,而且我现在很好奇。

    如果重要的话,这个应用程序正在运行PHP7。

    或者,如果有 这样做的一种方法,但它不是 __获取() ,将不胜感激

    2 回复  |  直到 8 年前
        1
  •  1
  •   Rangad    8 年前

    呼叫 bar 发生在 __get 返回。 __得到 由引擎调用,因此无法添加其他参数。但是,您可以在容器类上创建其他方法来实现所需的特性。

    假设我正确理解了你的问题,这将导致如下结果:

    public function executeOnService(string $name, string $method, ...$args) {
        return call_user_func_array([$this->service->$name, $method], $args);
    }
    
        2
  •  0
  •   Decent Dabbler    8 年前

    由于您已经期望您的 Container 要了解更多关于这个服务对象的属性,也许您应该考虑返回消费代码想要操作的服务的属性,例如:

    public function __get ($name) {
      return $service->$name;
    }