laravel Ioc Container (ServiceProvider服務容器)的魔力之一:automatic dependency resolution

本文來自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底層核心技術實戰揭祕》相應章節具體呈現~

相關文章
相關標籤/搜索