为了更好的理解 IOC (inversion of controller) 本文先理解一下什么是依赖注入 (dependency injection )

伪代码案例

什么是依赖?

从以下伪代码中,可以看到。PayBill 类中 payMyBill 方法的实现,需要先实例化 Alipay 类。所以这个时候依赖就产生了。

所以 ioc 的思想就是不要在 PayBill class 里面用 new 的方式去实例化解决依赖, 而且转为由外部来负责,简单一点就是内部没有 new 的这个步骤,通过依赖注入的方式同样的能获取到支付的实例。

<?php
//支付宝支付
class Alipay {
      public function __construct(){}
      public function pay() {
          echo 'pay bill by alipay';
      }
}
//微信支付
class Wechatpay {
      public function __construct(){}
      public function pay() {
          echo 'pay bill by wechatpay';
      }
}

//支付账单类
class PayBill {
      private $payMethodpublic function __construct() {
          $this->payMethod= new Alipay ();
      }
	  // 获取支付账单
      public function  payMyBill() {
           $this->payMethod->pay();
      }
}

// 获取支付宝账单
$pb = new PayBill ();
$pb->payMyBill();

什么是依赖注入?

跟之前的比较的话,我们加入一个 Pay 接口, 然后所有的支付方式都继承了这个接口并且实现了 pay 这个功能。

当我们实例化 PayBill class 的之前, 我们首先是实例化了一个 Alipay class,这个步骤就是生成了依赖了,然后我们需要把这个依赖注入到 PayBill class 的实例当中。

Alipay class 的实例通过 construct 注入的方式去实例化一个 PayBill class 在这里我们的注入是手动注入,不是自动的。而 Laravel 框架实现则是自动注入

<?php
//支付类接口
interface Pay {
    public function pay();
}

//支付宝支付
class Alipay implements Pay {
      public function __construct(){}
      public function pay() {
          echo 'pay bill by alipay';
      }
}
//微信支付
class Wechatpay implements Pay  {
      public function __construct(){}
      public function pay() {
          echo 'pay bill by wechatpay';
      }
}

//付款
class PayBill {
      private $payMethod;
      public function __construct(Pay $payMethod) {
          $this->payMethod= $payMethod;
      }
      public function  payMyBill() {
           $this->payMethod->pay();
      }
}

//生成依赖
$payMethod =  new Alipay();
//注入依赖
$pb = new PayBill( $payMethod );
$pb->payMyBill();