深入理解依赖注入是如何实现解耦-php教程

资源魔 33 0

第一章:小明以及他的手机

畴前有集体叫小明

小明有三年夜喜好,吸烟,饮酒…… 咳咳,欠好意义,走错片场了。应该是逛知乎、玩王者农药以及抢微信红包

微信截图_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教程》

以上就是深化了解依赖注入是若何完成解耦的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 ioc

抱歉,评论功能暂时关闭!