目的:解耦和減少依賴(lài)關(guān)系旺上;
控制反轉(zhuǎn)(IoC):由外部負(fù)責(zé)其依賴(lài)行為;
例如“超人”類(lèi)不需要在其內(nèi)部固化它的“超能力”顷编,而是由外部來(lái)產(chǎn)生暖释、組裝“超能力”,再通過(guò)“超人”的某個(gè)接口中植入墨吓;
只要“超能力”滿足某個(gè)接口球匕,就能被超人所使用;
依賴(lài)注入(DI):對(duì)象的依賴(lài)帖烘,由外部以參數(shù)或其他的形式傳入亮曹;
例如“超人”的構(gòu)造器,接收一個(gè)實(shí)現(xiàn)了“超能力”接口的對(duì)象秘症,這樣所有人都能給超人制造“超能力”照卦,只要這個(gè)“超能力”遵循“超能力”接口;
其實(shí)乡摹,IoC 和 DI 講的差不多是同一個(gè)意思役耕;
主角:IoC 容器;
IoC 和 DI 的概念都是為 IoC 容器做準(zhǔn)備聪廉,Laravel 的核心就是一個(gè) IoC 容器瞬痘;
IoC 容器是一個(gè)更為先進(jìn)的“工廠”故慈,它可以根據(jù)預(yù)定的腳本,自動(dòng)組裝類(lèi)所需要的依賴(lài)框全;
基本原理:我們通過(guò)注冊(cè)察绷、綁定的方式向容器中添加一段可以被執(zhí)行的回調(diào)(可以是匿名函數(shù)、非匿名函數(shù)津辩、類(lèi)的方法)作為生產(chǎn)一個(gè)類(lèi)的實(shí)例的 腳本 拆撼,只有在真正的 生產(chǎn)(make) 操作被調(diào)用執(zhí)行時(shí),才會(huì)觸發(fā)喘沿;
這樣一種方式闸度,使得我們更容易在創(chuàng)建一個(gè)實(shí)例的同時(shí)解決其依賴(lài)關(guān)系,并且更加靈活摹恨。當(dāng)有新的需求筋岛,只需另外綁定一個(gè)“生產(chǎn)腳本”即可;
Laravel 的 IoC 容器更加高級(jí)晒哄,可以根據(jù)類(lèi)的需求睁宰,自動(dòng)注冊(cè)、綁定符合的依賴(lài)寝凌,并自動(dòng)注入到構(gòu)造函數(shù)中去柒傻;
其原理也并不是很復(fù)雜,是使用了 PHP 的反射機(jī)制较木;
Laravel 服務(wù)容器實(shí)例教程 —— 深入理解控制反轉(zhuǎn)(IoC)和依賴(lài)注入(DI)