百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 深入了解依赖注入是怎样实现解耦
分享文章到:

深入了解依赖注入是怎样实现解耦

发布时间:09/01 来源:未知 浏览: 关键词:

第一章:小明和他的手机

从前有个人叫小明

小明有三大喜好,抽烟,喝酒…… 咳咳,不好意思,走错片场了。应当是逛知乎、玩王者农药和抢微信红包

微信截图_20200520095842.png

小明的三大喜好

我们用一段简便的伪代码,来制造一个这样的小明

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教程》

以上就是深入懂得依靠注入是怎样实现解耦的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板