PHP(DI)依赖注入

2022-10-26 19:35:35 浏览数 (2)

依赖注入

本质上是指对类的依赖通过构造器完成自动注入

通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要借助另一个类的才能完成的

最直接的标志就是 传参数据为对象 的时候。严格来说,你想在 另一个类中操作另一个类 ,这两个类之间形成了相互依赖关系, 传参的方式叫注入

简单的例子

代码语言: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

0 人点赞