laravel的核心是服務(wù)容器,也就是IOC容器。該容器提供了整個(gè)框架中需要的一系列服務(wù),其中包含了依賴注入和控制反轉(zhuǎn)兩部分,控制反轉(zhuǎn)是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。
本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。
laravel的核心是什么
服務(wù)容器,也叫IOC容器,其實(shí)包含了依賴注入(DI)和控制反轉(zhuǎn)(IOC)兩部分,是laravel的真正核心。其他的各種功能模塊比如 Route(路由)、Eloquent ORM(數(shù)據(jù)庫 ORM 組件)、Request and Response(請求和響應(yīng))等等等等,實(shí)際上都是與核心無關(guān)的類模塊提供的,這些類從注冊到實(shí)例化,最終被你所使用,其實(shí)都是 laravel 的服務(wù)容器負(fù)責(zé)的。服務(wù)容器這個(gè)概念比較難解釋清楚,只能一步步從服務(wù)容器的產(chǎn)生歷史慢慢解釋
該容器提供了整個(gè)框架中需要的一系列服務(wù)。
IoC 容器誕生的故事——石器時(shí)代(原始模式)
我們把一個(gè)“超人”作為一個(gè)類,
class Superman {}
我們可以想象,一個(gè)超人誕生的時(shí)候肯定擁有至少一個(gè)超能力,這個(gè)超能力也可以抽象為一個(gè)對象,為這個(gè)對象定義一個(gè)描述他的類吧。一個(gè)超能力肯定有多種屬性、(操作)方法,這個(gè)盡情的想象,但是目前我們先大致定義一個(gè)只有屬性的“超能力”,至于能干啥,我們以后再豐富:
class Power { /** * 能力值 */ protected $ability; /** * 能力范圍或距離 */ protected $range; public function __construct($ability, $range) { $this->ability = $ability; $this->range = $range; } }
這時(shí)候我們回過頭,修改一下之前的“超人”類,讓一個(gè)“超人”創(chuàng)建的時(shí)候被賦予一個(gè)超能力:
class Superman { protected $power; public function __construct() { $this->power = new Power(999, 100); } }
這樣的話,當(dāng)我們創(chuàng)建一個(gè)“超人”實(shí)例的時(shí)候,同時(shí)也創(chuàng)建了一個(gè)“超能力”的實(shí)例,但是,我們看到了一點(diǎn),“超人”和“超能力”之間不可避免的產(chǎn)生了一個(gè)依賴。
所謂“依賴”,就是“我若依賴你,少了你就沒有我”。
在一個(gè)貫徹面向?qū)ο缶幊痰捻?xiàng)目中,這樣的依賴隨處可見。少量的依賴并不會有太過直觀的影響,我們隨著這個(gè)例子逐漸鋪開,讓大家慢慢意識到,當(dāng)依賴達(dá)到一個(gè)量級時(shí),是怎樣一番噩夢般的體驗(yàn)。當(dāng)然,我也會自然而然的講述如何解決問題。
之前的例子中,超能力類實(shí)例化后是一個(gè)具體的超能力,但是我們知道,超人的超能力是多元化的,每種超能力的方法、屬性都有不小的差異,沒法通過一種類描述完全。我們現(xiàn)在進(jìn)行修改,我們假設(shè)超人可以有以下多種超能力:
飛行,屬性有:飛行速度、持續(xù)飛行時(shí)間
蠻力,屬性有:力量值
能量彈,屬性有:傷害值、射擊距離、同時(shí)射擊個(gè)數(shù)
我們創(chuàng)建了如下類:
class Flight { protected $speed; protected $holdtime; public function __construct($speed, $holdtime) {} } class Force { protected $force; public function __construct($force) {} } class Shot { protected $atk; protected $range; protected $limit; public function __construct($atk, $range, $limit) {} }
好了,這下我們的超人有點(diǎn)“忙”了。在超人初始化的時(shí)候,我們會根據(jù)需要來實(shí)例化其擁有的超能力嗎,大致如下:
class Superman { protected $power; public function __construct() { $this->power = new Fight(9, 100); // $this->power = new Force(45); // $this->power = new Shot(99, 50, 2); /* $this->power = array( new Force(45), new Shot(99, 50, 2) ); */ } }
我們需要自己手動的在構(gòu)造函數(shù)內(nèi)(或者其他方法里)實(shí)例化一系列需要的類,這樣并不好??梢韵胂?,假如需求變更(不同的怪物橫行地球),需要