/** * An array of the types that have been resolved. * * @var array */protected $resolved = array();
在閱讀laravel源碼的時候看到的.
位於Illuminate\Container\Container.
請問這個resolved是用來標記對應類型名是否已被解析過嗎?
resolved在有道詞典中的翻譯.
adj. 下定決心的;已解決的;斷然的
v. 解決;決定;分解;轉變(resolve的過去分詞)
回複內容:
/** * An array of the types that have been resolved. * * @var array */protected $resolved = array();
在閱讀laravel源碼的時候看到的.
位於Illuminate\Container\Container.
請問這個resolved是用來標記對應類型名是否已被解析過嗎?
resolved在有道詞典中的翻譯.
adj. 下定決心的;已解決的;斷然的
v. 解決;決定;分解;轉變(resolve的過去分詞)
請問這個resolved是用來標記對應類型名是否已被解析過嗎?
是啊.
你跟蹤下這個變數.
public function make($abstract, $parameters = array()){ $abstract = $this->getAlias($abstract); $this->resolved[$abstract] = true;
貌似這裡就是這個變數在整個架構唯一出現的地方了....
就是一個計數器,沒了.
View::make(...), App::make('foo')
$resolved = array('view'=>true,'foo'=>true);
估計為了方便debug而存在的?
我們知道,Laravel裡面存在著大量的Facade用法,比如你一開始寫的router,Router::get() ,你知道為啥可以這樣寫嗎?Router::get() 其實等價於$app->make('router')->get(); $app->make('router') 就是一個很形象的ioc容器, $app->make()就是容器,'router'就是放進去解析的類(的別名),$app->make('router') 就可以把 Route類的一個執行個體解析出來。
你可能要問,為啥要解析呢?解析是什麼意思呢?我New 一下那個類不就可以得到執行個體了嗎?首先,如果你把一個類綁定到Ioc的容器後,它可以自動幫你產生執行個體,不用include,不用new。其次new 一個類不能直接幫你解析出它依賴的類,特別是介面類,用new的方法你需要先用new建立執行個體,然後再傳入這個類依賴的執行個體(意味著有更多的new)。
詳細請看:Service Container(IOC容器)