前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP(DI)依赖注入

PHP(DI)依赖注入

作者头像
如梦初醒_-
修改2022-10-26 19:35:35
5360
修改2022-10-26 19:35:35
举报
文章被收录于专栏:最后一声蝉鸣最后一声蝉鸣

依赖注入

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

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

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

简单的例子

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;


class AdapterController
{
    public $name = '欢迎访问依赖注入';
}

使用

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;


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 App\Http\Controllers;

/**
 * 为了约束我们先定义一个消息接口
 * Interface MessageInterface
 */

interface MessageInterface
{
    public function send();
}

有一个发送邮件的类

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;
/**
 * 有一个发送邮件的类
 * Class SendEmailController
 */

class SendEmailController implements MessageInterface
{
    public function send()
    {
        return  'send email';
    }
}

新增一个发送短信的类

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;

/**
 *新增一个发送短信的类
 * Class SendSMSController
 */
class SendSMSController implements MessageInterface
{
    public function send()
    {
        return 'send sms';
    }
}

订单产生的时候 需要发送消息

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;
/*
 * 订单产生的时候 需要发送消息
 */

class OrderController
{
    protected $messager = '';

    function __construct(MessageInterface $message)
    {
        $this->messager = $message;

    }
    public function send_msg()
    {
        return $this->messager->send();
    }

}

调用

代码语言:javascript
复制
<?php


namespace App\Http\Controllers;


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖注入
  • 简单的例子
  • 使用
  • 结果
  • 高阶操作
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档