2017-08-04 42 views
0

我從框架Laravel有一個例子。PHP函數依賴如何工作?

class UserController extends Controller 
{ 
    public function store(Request $request) 
    { 
     $name = $request->input("name"); 
    } 
} 

我不明白的是,請求store()函數簽名內明確定義。

無法通過php的類型推斷找出傳入函數的內容?

這甚至會被視爲依賴注入嗎?

+0

是的,你只是簡單地說明你接受哪些數據類型進入函數。類/函數不知道如何實例化/創建該對象。如果你想進一步抽象,那麼在設置可接受的東西時使用通用的接口。 – JimL

回答

2

這是方法級依賴注入。將Request傳遞給store方法,而不是知道如何創建Request對象的store方法。

方法簽名中的類型提示做了兩件事。

首先,對於普通的PHP,它強制傳遞給store方法的參數必須是Request對象或繼承自Request的對象。如果您嘗試使用除Request對象(或後代)以外的任何其他方法調用store()方法,則會出現錯誤。

由於這種嚴格的類型強制的,我們知道$request參數必須是一個Request對象(或後代),我們可以依賴於它的公共接口即可投入使用(你知道input()方法會存在)。

其次,對於Laravel,它告訴Laravel容器該方法需要什麼類型的對象,以便正確的對象可以從容器中解析出來並傳遞給方法。 Laravel的控制器方法通過容器調用,它允許方法調用的自動依賴關係解析。

如果您要刪除類型提示,這將導致兩個問題。在抽象級別,它允許您將任何類型的對象,甚至標量值傳遞給store()方法。如果您嘗試撥打字符串input(),您將遇到問題。在更具體的層面上,這將打破Laravel的控制器方法的自動依賴關係解析。沒有類型提示,Laravel不知道該方法需要什麼對象,所以它不會傳遞任何東西,所以實際上你會得到一個錯誤,說你不能在上調用input()(或者說錯誤存儲方法需要一個參數;不確定,沒有測試)。