zoukankan      html  css  js  c++  java
  • 如何理解php的依赖注入

    之前写过关于php依赖注入的文章。。最近发现有的朋友对这个还是理解模糊,在这里我想写个简单的实例帮助朋友们理解下。。。
    传统的思路是应用程序用到一个A类,就会创建A类并调用A类的方法,假如这个方法内需要一个B类,就会创建B类并调用B类的方法,而这个方法内需要一个C类,就会创建C类,接着做些其它工作。

    <?php
    class C
    {
        public function doSomething()
        {
            echo __METHOD__, '我是C类|';
        }
    }
    
    class B
    {
        public function doSomething()
        {
            $bim = new C();
            $bim->doSomething();
            echo __METHOD__, '我是B类|';
        }
    }
    
    class A
    {
        public function doSomething()
        {
            $bar = new B();
            $bar->doSomething();
            echo __METHOD__, '我是A类|';;
        }
    }
    
    $class = new A();
    $class->doSomething(); //C::doSomething我是C类|B::doSomething我是B类|A::doSomething我是A类|

    使用依赖注入的思路是应用程序用到A类,A类需要B类,B类需要C类,那么先创建C类,再创建B类并把C注入,再创建A类,并把B类注入,再调用A方法,A调用B方法,接着做些其它工作。

    <?php
    
    class C
    {
        public function doSomething()
        {
            echo __METHOD__, '我是C类|';
        }
    }
    
    class B
    {
        private $c;
    
        public function __construct(C $c)
        {
            $this->c = $c;
        }
    
        public function doSomething()
        {
            $this->c->doSomething();
            echo __METHOD__, '我是B类|';
        }
    }
    class A
    {
        private $b;
    
        public function __construct(B $b)
        {
            $this->b = $b;
        }
    
        public function doSomething()
        {
            $this->b->doSomething();
            echo __METHOD__, '我是A类|';;
        }
    }
    
    $class = new A(new B(new C()));
    $class->doSomething(); // C::doSomething我是C类|B::doSomething我是B类|A::doSomething我是A类|

    这就是控制反转模式。依赖关系的控制反转到调用链的起点。这样你可以完全控制依赖关系,通过调整不同的注入对象,来控制程序的行为。例如A类用到了memcache,可以在不修改A类代码的情况下,改用redis。

    使用依赖注入容器后的思路是应用程序需要到A类,就从容器内取得A类,容器创建C类,再创建B类并把C注入,再创建A类,并把B注入,应用程序调用A方法,A调用B方法,接着做些其它工作.

    总之容器负责实例化,注入依赖,处理依赖关系等工作。其实依赖注入不难理解哦。

  • 相关阅读:
    减肥 day1
    这两天的学习内容
    小马激活工具激活系统导致系统崩溃
    mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装
    JDK 动态代理实现原理
    php ajax提交post请求出现数组被截断情况的解决方法
    mac OS X下git代码行统计命令
    mac OS X下安装Redis及Thinkphp3.1使用Redis
    linux服务器git pull/push时提示输入账号密码之免除设置
    linux服务器修改ftp默认21端口方法
  • 原文地址:https://www.cnblogs.com/phpper/p/7781119.html
Copyright © 2011-2022 走看看