为了更好的理解 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 $payMethod;
public 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();