依赖注入
本质上是指对类的依赖通过构造器完成自动注入
通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要借助另一个类的才能完成的
最直接的标志就是 传参数据为对象 的时候。严格来说,你想在 另一个类中操作另一个类 ,这两个类之间形成了相互依赖关系, 传参的方式叫注入
简单的例子
代码语言:javascript复制<?php
namespace AppHttpControllers;
class AdapterController
{
public $name = '欢迎访问依赖注入';
}
使用
代码语言:javascript复制<?php
namespace AppHttpControllers;
class IndexController
{
protected $Adapter;
public function __construct(AdapterController $Adapter)
{
$this->Adapter = $Adapter;
}
public function test()
{
return 'Hello,' . $this->Adapter->name;
}
}
结果
代码语言:javascript复制Hello,欢迎访问依赖注入
高阶操作
传统的写法
代码语言:javascript复制<?php
/**
* 定义了一个消息类
* Class Message
*/
class Message{
public function seed()
{
return 'seed email';
}
}
代码语言:javascript复制/*
* 订单产生的时候 需要发送消息
*/
class Order{
protected $messager = '';
function __construct()
{
$this->messager = new Message();
}
public function seed_msg()
{
return $this->messager->seed();
}
}
$Order = new Order();
$Order->seed_msg();
上面的代码是我们传统的写法。首先由个消息发送的类。然后在我们需要发送消息的地方,调用发送消息的接口。有一天你需要添加一个发送短信的接口以满足不同的需求。那么你会发现你要再Message类里面做修改。同样也要再Order类里面做修改。这样就显得很麻烦。这个时候就有了依赖注入的思路。下面把代码做一个调整
上面的代码是我们传统的写法。首先由个消息发送的类。然后在我们需要发送消息的地方,调用发送消息的接口。有一天你需要添加一个发送短信的接口以满足不同的需求。那么你会发现你要再Message类里面做修改。同样也要再Order类里面做修改。这样就显得很麻烦。这个时候就有了依赖注入的思路。下面把代码做一个调整
依赖注入写法
为了约束我们先定义一个消息接口
代码语言:javascript复制<?php
namespace AppHttpControllers;
/**
* 为了约束我们先定义一个消息接口
* Interface MessageInterface
*/
interface MessageInterface
{
public function send();
}
有一个发送邮件的类
代码语言:javascript复制<?php
namespace AppHttpControllers;
/**
* 有一个发送邮件的类
* Class SendEmailController
*/
class SendEmailController implements MessageInterface
{
public function send()
{
return 'send email';
}
}
新增一个发送短信的类
代码语言:javascript复制<?php
namespace AppHttpControllers;
/**
*新增一个发送短信的类
* Class SendSMSController
*/
class SendSMSController implements MessageInterface
{
public function send()
{
return 'send sms';
}
}
订单产生的时候 需要发送消息
代码语言:javascript复制<?php
namespace AppHttpControllers;
/*
* 订单产生的时候 需要发送消息
*/
class OrderController
{
protected $messager = '';
function __construct(MessageInterface $message)
{
$this->messager = $message;
}
public function send_msg()
{
return $this->messager->send();
}
}
调用
代码语言:javascript复制<?php
namespace AppHttpControllers;
class IndexController
{
public function test()
{
//我们需要发送邮件的时候
$message = new SendEmailController();
//将邮件发送对象作为参数传递给Order
$Order = new OrderController($message);
echo '触发邮件---'.$Order->send_msg().PHP_EOL;
//我们需要发送短信的时候
$message = new SendSMSController();
$Order = new OrderController($message);
echo '触发短信---'.$Order->send_msg().PHP_EOL;
}
}
结果
触发邮件---send email 触发短信---send sms