search
HomeBackend DevelopmentPHP TutorialDeeply understand how dependency injection achieves decoupling

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. If there is any infringement, please contact admin@php.cn delete
PHP in Action: Real-World Examples and ApplicationsPHP in Action: Real-World Examples and ApplicationsApr 14, 2025 am 12:19 AM

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP: Creating Interactive Web Content with EasePHP: Creating Interactive Web Content with EaseApr 14, 2025 am 12:15 AM

PHP makes it easy to create interactive web content. 1) Dynamically generate content by embedding HTML and display it in real time based on user input or database data. 2) Process form submission and generate dynamic output to ensure that htmlspecialchars is used to prevent XSS. 3) Use MySQL to create a user registration system, and use password_hash and preprocessing statements to enhance security. Mastering these techniques will improve the efficiency of web development.

PHP and Python: Comparing Two Popular Programming LanguagesPHP and Python: Comparing Two Popular Programming LanguagesApr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

The Enduring Relevance of PHP: Is It Still Alive?The Enduring Relevance of PHP: Is It Still Alive?Apr 14, 2025 am 12:12 AM

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

PHP's Current Status: A Look at Web Development TrendsPHP's Current Status: A Look at Web Development TrendsApr 13, 2025 am 12:20 AM

PHP remains important in modern web development, especially in content management and e-commerce platforms. 1) PHP has a rich ecosystem and strong framework support, such as Laravel and Symfony. 2) Performance optimization can be achieved through OPcache and Nginx. 3) PHP8.0 introduces JIT compiler to improve performance. 4) Cloud-native applications are deployed through Docker and Kubernetes to improve flexibility and scalability.

PHP vs. Other Languages: A ComparisonPHP vs. Other Languages: A ComparisonApr 13, 2025 am 12:19 AM

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

PHP vs. Python: Core Features and FunctionalityPHP vs. Python: Core Features and FunctionalityApr 13, 2025 am 12:16 AM

PHP and Python each have their own advantages and are suitable for different scenarios. 1.PHP is suitable for web development and provides built-in web servers and rich function libraries. 2. Python is suitable for data science and machine learning, with concise syntax and a powerful standard library. When choosing, it should be decided based on project requirements.

PHP: A Key Language for Web DevelopmentPHP: A Key Language for Web DevelopmentApr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment