Home >Backend Development >PHP Tutorial >Deeply understand how dependency injection achieves decoupling

Deeply understand how dependency injection achieves decoupling

Guanhui
Guanhuiforward
2020-05-20 10:05:022176browse

Deeply understand how dependency injection achieves decoupling

Chapter 1: Xiao Ming and his mobile phone

Once upon a time there was a man named Xiao Ming

Xiao Ming has three major hobbies, smoking and drinking... Ahem, sorry, I went to the wrong set. It should be browsing Zhihu, playing King Pesticide and grabbing WeChat red envelopes

Deeply understand how dependency injection achieves decoupling

Xiao Ming’s three major hobbies

We use a simple pseudo-code to create a Such Xiao Ming

class Ming extends Person
{
    private $_name;
    private $_age;
    function read()
    {
        //逛知乎
    }
    function  play()
    {
        //玩农药
    }
    function  grab()
    {
        //抢红包
    }
}

However, as a human being, Xiao Ming has no way to achieve the above functions by himself. He must rely on a mobile phone, so he bought an iphone6. Next, let’s make one iphone6

class iPhone6 extends Iphone
{
    function read($user="某人")
    {
        echo $user."打开了知乎然后编了一个故事 \n";
    }
    function play($user="某人")
    {
        echo $user."打开了王者农药并送起了人头 \n";
    }
    function grab($user="某人")
    {
        echo $user."开始抢红包却只抢不发 \n";
    }
}

Xiao Ming cherishes his new mobile phone very much and controls it firmly in his hand every day, so Xiao Ming becomes like this

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);//抢红包
    }
}

Today is Saturday, Xiao Ming does not have to go to work, so He got up, browsed Zhihu, played King Pesticide, and grabbed a red envelope.

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();

At this time, we can see the output in the command line as follows

Xiao Ming opened Zhihu and made up a story

Xiao Ming opened the King Pesticide and sent it Killed

Xiao Ming started to grab the red envelope but could only grab it but not give it out

On this day, Xiao Ming had a fulfilling life. He felt that he was the happiest person in the world.

Chapter 2: Xiao Ming’s happiness and sadness

Xiao Ming and his mobile phone once spent a wonderful time together. When he had free time, he hugged Using his mobile phone, browsing Zhihu, browsing Weibo, and playing games, he felt that he didn't need a girlfriend at all, as long as he had his mobile phone by his side, he would be satisfied.

But who would have thought that system updates again and again completely shattered his dream, his phone became more and more laggy, and the battery life became shorter and shorter, until one day In the cold wind, his cell phone finally couldn't stand the cold and turned it off without looking back.

Xiao Ming was very sad. He realized that he had to change his mobile phone.

In order to get a better user experience, Xiao Ming gritted his teeth and bought an iPhone One problem he encountered was that he had relied too much on the original iPhone 6, and they were deeply coupled. If he wanted to change his phone, he would have to take a knife to transform himself and remove all the methods in his body. All iphone6s have been replaced by iphoneX.

Long transformation process

After a long transformation process, Xiao Ming finally replaced all iphone6 ​​in the code with iphoneX. Although it is very hard, Xiao Ming feels that he is happy.

So Xiao Ming happily took his mobile phone to work, but was stolen by a thief on the way back. For emergencies, Xiao Ming had no choice but to reuse the iPhone 6 that had just been abandoned. However, when he thought of the long transformation process, Xiao Ming felt unspeakably aggrieved. He felt that he was too dependent on his mobile phone. Why did he feel that every time something went wrong with his mobile phone? He has to transform himself. This is not just over-coupling, it is simply putting the cart before the horse. He shouted to the sky, I don’t want to control my mobile phone anymore.

The creator in the sky, that is, me as a programmer, heard his cry. I told him, you don’t need to control your phone anymore, leave it to me to manage, give me the control. . This is called inversion of control.

Chapter 3: The Wisdom of the Creator

Xiao Ming heard what I said. He was both happy and a little scared. He knelt down and kowtowed a few times, piously. Said: "It turns out that you are the legendary creator, God Bagmek. I heard you just said the four words of control inversion, which is to hand over the control of the mobile phone from my hands to you, but this It’s just your idea, it’s just a thought. What method can be used to achieve inversion of control and allow me to continue using my mobile phone?” After that, I threw down four big words, "Dependency Injection!"

Next, the great me began to make inhumane changes to Xiao Ming, as follows

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);//抢红包
    }
}

Next, let's simulate running Xiao Ming One day

$phone = new IphoneX(); //创建一个iphoneX的实例
if($phone->isBroken()){//如果iphone不可用,则使用旧版手机
    $phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();

Let’s first see if the iphone The mobile phone is injected directly into his body. He does not need to care about which mobile phone he is holding, he just needs to use it directly.

This is dependency injection.

Chapter 4: Xiao Ming’s insights

Xiao Ming’s life began to become simpler, and he spent all the time he saved writing notes. Write this in your notebook

I used to have a strong desire to control and relied too much on my mobile phone, which resulted in a high degree of coupling between me and my mobile phone. As long as there was a slight problem with my mobile phone, I would have to transform myself. This is really a waste of time. It’s easy to go wrong. Since I gave control to the Creator, He has already chosen a mobile phone for me before waking me up every day. I just need to play with it as usual, without caring about what kind of mobile phone it is. Even if there is a problem with the mobile phone, it can be solved directly by the Creator. There is no need to modify myself. I have now bought seven mobile phones and handed them over to the Creator. I change one every day. I am so happy!

I also gained this insight: If the function implementation of a class A requires the help of class B, then class B is said to be a dependency of class A. If the class is instantiated inside class A, B, then there will be a high degree of coupling between the two. Once there is a problem with class B, class A also needs to be transformed. If there are many such situations and there are many dependencies between each class, then there will be conflicts. If the whole body is affected by one attack, the program will be extremely difficult to maintain and problems will easily occur. To solve this problem, it is necessary to extract the control of Class A from Class B and hand it over to a third party. Reversing the control to the third party is called Inversion of Control (IOC Inversion Of Control). Inversion of control is an idea and a possible result that can solve problems, and dependency injection (Dependency Injection) is its most typical implementation method. A third party (we call it an IOC container) controls the dependency and injects it into class A through methods such as constructors, attributes, or factory patterns, thus decoupling class A and class B to a great extent.

Recommended tutorial: "PHP Tutorial"

The above is the detailed content of Deeply understand how dependency injection achieves decoupling. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:zhihu.com. If there is any infringement, please contact admin@php.cn delete