2016-02-26 105 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()'中訪問這些方法。 –