2016-02-26 63 views
0

我没有寄予厚望,这一个:额外拼抢(链接)方法调用到__get()魔法方法

由于有像$service->foo->bar($a, $b)foo和具有容器类的行动服务$service作为受保护的财产,有没有办法使用容器上的__get()访问服务并传递->bar($a, $b)

class Container { 
    protected $service; 
    protected $responses = []; 

    public function __get ($name) { 
    $this->responses[] = $service->$name-> _???_ 
    return $resp; 
    } 
} 

可能被拦截使容器能赶上操作,调用$service有了它,保存响应,然后返回响应

要么某些方式攫取其他任何被链接的$name或者如果$name只包括所有这些。我知道这有点复杂,但它会帮助我大幅清理一些代码,再加上我现在普遍好奇。

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

而且交替,如果有办法做到这一点,但它不是__get(),洞察力,将不胜感激

回答

1

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

假设我理解你的问题正确,这将导致这样的事情:

public function executeOnService(string $name, string $method, ...$args) { 
    return call_user_func_array([$this->service->$name, $method], $args); 
} 
+0

这可能是最合理的方法。我所希望的是完全重新创建实际呼叫的语法,只是通过Container重定向。虽然看起来不可能。讨厌鬼。 –

0

既然你已经期待您的Container的消费者代码就知道了很多关于这个服务对象的属性,也许你应该只是考虑返回消费代码想要采取的服务的属性,例如:

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

问题是我想处理容器中的动作,将结果存储在容器中,并*还*返回结果。所以'$ service - > $ name'结尾会有链接方法,但我不认为我有任何方法可以从'__get()'中访问这些方法。 –