我從框架Laravel有一個例子。PHP函數依賴如何工作?
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input("name");
}
}
我不明白的是,請求store()
函數簽名內明確定義。
無法通過php的類型推斷找出傳入函數的內容?
這甚至會被視爲依賴注入嗎?
我從框架Laravel有一個例子。PHP函數依賴如何工作?
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input("name");
}
}
我不明白的是,請求store()
函數簽名內明確定義。
無法通過php的類型推斷找出傳入函數的內容?
這甚至會被視爲依賴注入嗎?
這是方法級依賴注入。將Request
傳遞給store
方法,而不是知道如何創建Request
對象的store
方法。
方法簽名中的類型提示做了兩件事。
首先,對於普通的PHP,它強制傳遞給store
方法的參數必須是Request
對象或繼承自Request
的對象。如果您嘗試使用除Request
對象(或後代)以外的任何其他方法調用store()
方法,則會出現錯誤。
由於這種嚴格的類型強制的,我們知道$request
參數必須是一個Request
對象(或後代),我們可以依賴於它的公共接口即可投入使用(你知道input()
方法會存在)。
其次,對於Laravel,它告訴Laravel容器該方法需要什麼類型的對象,以便正確的對象可以從容器中解析出來並傳遞給方法。 Laravel的控制器方法通過容器調用,它允許方法調用的自動依賴關係解析。
如果您要刪除類型提示,這將導致兩個問題。在抽象級別,它允許您將任何類型的對象,甚至標量值傳遞給store()
方法。如果您嘗試撥打字符串input()
,您將遇到問題。在更具體的層面上,這將打破Laravel的控制器方法的自動依賴關係解析。沒有類型提示,Laravel不知道該方法需要什麼對象,所以它不會傳遞任何東西,所以實際上你會得到一個錯誤,說你不能在上調用input()
(或者說錯誤存儲方法需要一個參數;不確定,沒有測試)。
是的,你只是簡單地說明你接受哪些數據類型進入函數。類/函數不知道如何實例化/創建該對象。如果你想進一步抽象,那麼在設置可接受的東西時使用通用的接口。 – JimL