本文來自pilishen.com----原文連接; 歡迎做客咱們的php&Laravel學習羣:109256050php
該篇屬於《Laravel底層核心技術實戰揭祕》這一課程《laravel底層核心概念解析》這一章的擴展閱讀。因爲要真正學好laravel底層,有些PHP相關的知識必須得了解,考慮到學員們的基礎差別,爲了不視頻當中過於詳細而連篇累牘,故將一些laravel底層實現相關的PHP知識點以文章形式呈現,供你們預習和隨時查閱。laravel
在laravel的routes.php
或者web.php
裏以下測試:web
class Bar {}
Route::get('/test', function(Bar $bar){
dd($bar);
});
複製代碼
在以前的文章裏,咱們知道,要往一個函數或方法裏傳參,尤爲是傳class的實例化對象,那麼以前你必須得有個實例,說白了就是得new
一下,可是上面的代碼沒瞅見有傳參過程,只是這個route
的回調函數裏指望傳入一個Class Bar
的實例$bar
,沒有實例化過程,這能行嗎?bash
Bar {#250}
複製代碼
咦?竟然能夠!框架
好,既然你能夠,先無論別的,我再給你整的複雜些:ide
class Baz {}
class Bar {
protected $baz;
public function __construct(Baz $baz)
{
$this->baz = $baz;
}
}
Route::get('/test', function(Bar $bar){
dd($bar);
});
複製代碼
看你此次還行?函數
Bar {#253 ▼
#baz: Baz {#255}
}
複製代碼
呀!厲害了——我可沒有給你傳new Bar(new Baz)
進去啊!post
也便是說,不管是在route回調函數裏,仍是在controller裏,仍是其餘相關地方,laravel的IoC Container能自動進行依賴解析、注入,像上面的例子,它能知道咱們指望傳入一個Class Bar
的實例$bar
,而後自動背後給咱們建立了一個,同時,它也能知道Class Bar
的constructor中須要傳入一個Class Baz
實例,也進一步給咱們建立了。因此,這整個過程當中,咱們不須要去手動new
。學習
可能,以前你有本身查看過laravel的源碼,在層層依賴的狀況下,你會發現明明其間不少class都有constructor,都須要傳入dependency,可是laravel在調用的過程當中,啥也沒給傳,按照以前的思路,這根本行不通嘛~測試
那麼如今,我們知道laravel的Container能自動解析依賴(automatic dependency resolution
),雖然如今還不清楚它背後具體怎麼實現,至少不影響繼續往下看源碼了。
至於具體是怎麼實現的,以及我們可否本身寫一個這樣的功能,而後用在本身的框架裏,這些咱們在《Laravel底層核心技術實戰揭祕》相應章節具體呈現~