本帖最后由 wesley.chen 于 2018-7-2 11:16 编辑
1.什么是依赖我们先通过以下实例理解下什么依赖 //支付宝支付
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 Unionpay{
public function __construct(){}
public function pay()
{
echo 'pay bill by unionpay';
}
}
//支付账单
class PayBill {
private $payMethod;
public function __construct( )
{
$this->payMethod= new Alipay ();
}
public function payMyBill()
{
$this->payMethod->pay();
}
}
$pb = new PayBill ();
$pb->payMyBill();通过上面的代码我们知道,当我们创建一个class PayBill 的实例的时候, PayBill 的构造函数里面有 $this->payMethod= new Alipay ();也就是实例化了一个class Alipay . 这个时候依赖就产生了, 这里可以理解为当我想用支付宝支付的时候, 那我首先要获取到一个支付宝的实例,或者理解为获取支付宝的功能支持. 当我们用完 new 关键字的时候, 依赖其实已经解决了,因为我们获取了Alipay 的实例. 在ioc概念之前,我的代码中大部分都是这种模式 . 这种有什么问题呢, 简单来说, 比如当我想用的不是支付宝而是微信的时候怎么办, 你能做的就是修改Payment 的构造函数的代码,实例化一个微信支付Wechatpay. 如果我们的程序不是很大的时候可能还感觉不出什么,但是当你的代码非常复杂,庞大的时候,如果我们的需求经常改变,那么修改代码就变的非常麻烦了。所以ioc 的思想就是不要在 class Payment 里面用new 的方式去实例化解决依赖, 而且转为由外部来负责,简单一点就是内部没有new 的这个步骤,通过依赖注入的方式同样的能获取到支付的实例。 2.依赖注入IOC( inversion of controller )叫做控制反转, 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。DI(dependency injection ) 依赖注入,其实和控制反转是对同一件事情的不同描述,DI是从应用程序的角度描述,可以看作是IOC的实现方式。 //支付类接口
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 Unionpay implements Pay {
public function __construct(){}
public function pay()
{
echo 'pay bill by unionpay';
}
}
//付款
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();上面的代码中,跟之前的比较的话,我们加入一个Pay 接口, 然后所有的支付方式都继承了这个接口并且实现了pay 这个功能. 可能大家会问为什么要用接口,这个我们稍后会讲到. 当我们实例化PayBill的之前, 我们首先是实例化了一个Alipay,这个步骤就是生成了依赖了,然后我们需要把这个依赖注入到PayBill 的实例当中,通过代码我们可以看到 $this->payMethod= new Alipay ()我们是通过了构造函数把这个依赖注入了PayBill 里面. 这样一来 $pb 这个PayBill 的实例就有了支付宝支付的能力了. 这里把class Alipay 的实例通过constructor注入的方式去实例化一个 class PayBill. 在这里我们的注入是手动注入, 不是自动的. 而Laravel 框架实现则是自动注入. |