深入了解依赖注入是怎样实现解耦
第一章:小明和他的手机
从前有个人叫小明
小明有三大喜好,抽烟,喝酒…… 咳咳,不好意思,走错片场了。应当是逛知乎、玩王者农药和抢微信红包
小明的三大喜好
我们用一段简便的伪代码,来制造一个这样的小明
class Ming extends Person { private $_name; private $_age; function read() { //逛知乎 } function play() { //玩农药 } function grab() { //抢红包 } }
但是,小明作为一个人类,没有方法仅靠本人就能实现以上的功效,他必需依靠一部手机,所以他买了一台iphone6,接下来我们来制造一个iphone6
class iPhone6 extends Iphone { function read($user="某人") { echo $user."翻开了知乎然后编了一个故事 \n"; } function play($user="某人") { echo $user."翻开了王者农药并送起了人头 \n"; } function grab($user="某人") { echo $user."开端抢红包却只抢不发 \n"; } }
小明非常珍爱本人的新手机,每天把它牢牢操纵在手心里,所以小明变成了这个模样
class Ming extends Person { private $_name; private $_age; public function __construct() { $this->_name = '小明'; $this->_age = 26; } function read() { //…… 省略若干代码 (new iPhone6())->read($this->_name); //逛知乎 } function play() { //…… 省略若干代码 (new iPhone6())->play($this->_name);//玩农药 } function grab() { //…… 省略若干代码 (new iPhone6())->grab($this->_name);//抢红包 } }
今天是周六,小明不消上班,于是他起床,并顺次逛起了知乎,玩王者农药,并抢了个红包。
$ming = new Ming(); //小明起床 $ming->read(); $ming->play(); $ming->grab();
这个时候,我们可以在命令行里看到输出如下
小明翻开了知乎然后编了一个故事
小明翻开了王者农药并送起了人头
小明开端抢红包却只抢不发
这一天,小明过得很充实,他觉得本人是世界上最幸福的人。
第二章: 小明的欢乐与哀伤
小明和他的手机曾一起度过了一段美妙的时间,一到余暇时刻,他就抱着手机,逛知乎,刷微博,玩游戏,他觉得本人基本不需要女伴侣,只要有手机在身边,就知足了。
可谁能想到,一次次地系统更新彻底打碎了他的妄想,他的手机变得越来越卡顿,电池的使用寿命也越来越短,不断到某一天的北风中,他的手机终于耐不住冰冷,头也不回地关了机。
小明很哀伤,他意识到,本人要换手机了。
为了能获得更好的使用体验,小明一咬牙,剁手了一台iphoneX,这部手机铃声很大,电量很足,还能双卡双待,小明很喜爱,但是他碰到一个问题,就是他此前过度依靠了本来那一部iPhone6,他们之间已经深深耦合在一起了,假如要换手机,他就要拿起刀来革新本人,把本人体内所有办法中的iphone6 都换成 iphoneX。
漫长的革新历程
经历了漫长的革新历程,小明终于把代码中的 iphone6 全部换成了 iphoneX。虽然很辛劳,但是小明觉得他是欢乐的。
于是小明开快乐心地带着手机去上班了,并在回来的路上被小偷偷走了。为了应急,小明只好从新使用那部刚刚被抛弃的iphone6,但是一想到那漫长的革新历程,小明的心里就说不出的委屈,他觉得本人过于依靠手机了,为什么每次手机出什么问题他都要去革新他本人,这不仅仅是过度耦合,几乎是本末颠倒,他向天空大喊,我不要再操纵我的手机了。
天空中的造物主,也就是作为程序员的我,听到了他的呐喊,我告诉他,你不消再操纵你的手机了,交给我来治理,把操纵权交给我。这就叫做操纵反转。
第三章:造物主的聪慧
小明听到了我的话,他既快乐,又有一点惧怕,他跪下来磕了几个头,真诚地说到:“本来您就是传奇中的造物主,巴格梅克上神。我听到您刚刚说了 操纵反转 四个字,就是把手机的操纵权从我的手里交给你,但这只是您的设法,是一种思想罢了,要用什么方法才能实现操纵反转,又可以让我连续使用手机呢?”
“呵“,身为造物主的我在展现完不屑今后,扔下了四个大字,“依靠注入!”
接下来,伟大的我开端对小明停止惨无人道的革新,如下
class Ming extends Person { private $_name; private $_age; private $_phone; //将手机作为本人的成员变量 public function __construct($phone) { $this->_name = '小明'; $this->_age = 26; $this->_phone = $phone; echo "小明起床了 \n"; } function read() { //…… 省略若干代码 $this->_phone->read($this->_name); //逛知乎 } function play() { //…… 省略若干代码 $this->_phone->play($this->_name);//玩农药 } function grab() { //…… 省略若干代码 $this->_phone->grab($this->_name);//抢红包 } }
接下来,我们来模拟运转小明的一天
$phone = new IphoneX(); //创立一个iphoneX的实例 if($phone->isBroken()){//假如iphone不成用,则使用旧版手机 $phone = new Iphone6(); } $ming = new Ming($phone);//小明不消关怀是啥手机,他只要玩就行了。 $ming->read(); $ming->play(); $ming->grab();
我们先看一下iphoneX 可否可以使用,假如不成以使用,则直接换成iphone6,然后叫醒小明,并把手机塞到他的手里,换句话说,把他所依靠的手机直接注入到他的身上,他不需要关怀本人拿的是啥手机,他只要直接使用就可以了。
这就是依靠注入。
第四章:小明的感悟
小明的生活开端变得简便了起来,而他把省出来的时间都用来写笔记了,他在笔记本上这样写到
我曾经有很强的操纵欲,过度依靠于我的手机,致使我和手机之间耦合程度太高,只要手机显现一点点问题,我都要革新我本人,这实在是既白费时间又容易出问题。自从我把操纵权交给了造物主,他每天在叫醒我之前,就已经替我选好了手机,我只要依照平常一样玩手机就可以了,基本不消关怀是啥手机。即使手机出了问题,也可以由造物主直接搞定,不需要再革新我本人了,我此刻买了七部手机,都交给了造物主,每天换一部,美滋滋!
我也从其中获得了这样的感悟: 假如一个类A 的功效实现需要借助于类B,那么就称类B是类A的依靠,假如在类A的内部去实例化类B,那么两者之间会显现较高的耦合,一旦类B显现了问题,类A也需要停止革新,假如这样的状况较多,每个类之间都有许多依靠,那么就会显现牵一发而动全身的状况,程序会极难保护,并且很容易显现问题。要解决这个问题,就要把A类对B类的操纵权抽离出来,交给一个第三方去做,把操纵权反转给第三方,就称作操纵反转(IOC Inversion Of Control)。操纵反转是一种思想,是能够解决问题的一种大概的结果,而依靠注入(Dependency Injection)就是其最典型的实现办法。由第三方(我们称作IOC容器)来操纵依靠,把他通过结构函数、属性或者工厂模式等办法,注入到类A内,这样就极大程度的对类A和类B停止理解耦。
引荐教程:《PHP教程》
以上就是深入懂得依靠注入是怎样实现解耦的具体内容,更多请关注百分百源码网其它相关文章!