分为如下两部分:

  1. 依赖注入
  2. 容器

  1. 依赖注入

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

    2. 在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。

    3. 案例:

      // 模型层 One
      namespace app\model;
      use think\Model;
      class One extends Model
      {
      public $username = 'laowen';
      } // 控制器
      namespace app\controller;
      use app\model\One;
      class TestOne
      {
      protected $one;
      public function __construct(One $one)
      {
      $this->one = $one;
      }
      public function index()
      {
      return $this->one->username;
      }
      }
    4. 依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束);

    5. 而传递的对象背后的那个类被自动绑定并且实例化了,这就是依赖注入;

    6. 支持使用依赖注入的场景包括(但不限于):

      • 控制器架构方法;
      • 控制器操作方法;
      • 路由的闭包定义;
      • 事件类的执行方法;
      • 中间件的执行方法;
  2. 容器

    1. 依赖注入的类统一由容器管理的,大多数情况下是自动绑定和自动实例化的;

    2. 如果想手动来完成绑定和实例化,可以使用bind()和app()助手函数来实现;

      class TestTwo
      {
      public function bind()
      {
      bind('one', 'app\model\One');
      return app('one')->username;
      }
      }
      // bind('one' ,'...')绑定类库标识,这个标识具有唯一性,以便快速调用;
      // app('one') 快速调用,并自动实例化对象,标识严格保持一致包括大小写;
    3. 自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则:

      class TestTwo
      {
      public function bind()
      {
      bind('one', 'app\model\One');
      // 每次调用总是会重新实例化
      return app('one',[], true)->username; // app()中第二参数,方法实例化对象的时候,传递参数;
      // 模型层通过构造函数来接收数据
      // $one = app('one', [['test']], true);
      // return $one->username;
      }
      }
    4. 通过 app() 绑定一个类到容器中并自动实例化;

      class TestTwo
      {
      public function bind()
      {
      return app('app\model\One')->username;
      }
      }
    5. 批量绑定到容器中

      public function bind()
      {
      bind([
      'one' => 'app\model\One',
      'user' => 'app\model\User'
      ]); // bind([
      // 'one' => \app\model\One::class,
      // 'user' => \app\model\User::class
      // ]);
      // ::class 模式,不需要单引号;
      // 而是需要在最前面加上\,之前的加不加都行;
      return app('one')->username;
      }
    6. 系统提供了 provider.php 文件,用于批量绑定类到容器中;

    7. 系统内置了很多常用的类库,以便开发者快速调用;

ThinkPHP6.0 容器和依赖注入的更多相关文章

  1. .Net Core 3.0 内置依赖注入:举例

    原文:.Net Core 3.0 内置依赖注入:举例 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  2. IOC容器的依赖注入

    1.依赖注入发生的时间 当Spring IoC容器完成了Bean定义资源的定位.载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入 ...

  3. springboot成神之——ioc容器(依赖注入)

    springboot成神之--ioc容器(依赖注入) spring的ioc功能 文件目录结构 lang Chinese English GreetingService MyRepository MyC ...

  4. 通过中看不中用的代码分析Ioc容器,依赖注入....

    /** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...

  5. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

  6. AspectCore中的IoC容器和依赖注入

    IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Cor ...

  7. 从celery rabbitmq with docker-compose 引出对容器、依赖注入、TDD的感悟

    用docker配置项目管理系统taiga的时候,不是我一个人遇到这个问题.https://github.com/douglasmiranda/docker-taiga/issues/5 问题描述: 用 ...

  8. ASP.NET Core 1.0基础之依赖注入

      来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...

  9. Spring源码解析三:IOC容器的依赖注入

    一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...

随机推荐

  1. Python logging 模块打印异常 exception

    logger.exception(sys.exc_info())

  2. 日志分析工具ELK(四)

    Logstash收集TCP日志 #Input plugins TCP插件 所需的配置选项 tcp { port =>... } [root@linux-node1 ~]# cat tcp.con ...

  3. 15个有趣好玩的linux shell 命令

    今天介绍一些有趣的linux shell命令,所有的命令都可以使用man + 命令名称 来查看完整的使用方法. 1,figlet 字符画 figlet 可以将英文字符串以字符画的形式输出: >& ...

  4. opencv-1-QT_OPENCV 安装

    opencv-1-QT_OPENCV 安装 qtopencvc++ 既然我们是从头开始的, 那我们就从 opencv 的安装开始吧, 主要环境为: win10 1909 - 18363.720 版本 ...

  5. Shell中的here文档

    1.名词解释: 以下是维基百科解释: here文档[1],又称作heredoc.hereis.here-字串或here-脚本,是一种在命令行shell(如sh.csh.ksh.bash.PowerSh ...

  6. 计算机网络 之 Cisco packet tracer 的安装及汉化

    可以去官网下载最新版本的Cisco packet tracer 免费 汉化包及7.1版本百度云链接:链接: https://pan.baidu.com/s/1XudelgnMu6XysCZ36csl7 ...

  7. 【Layui__监听button】在form中监听按钮事件

    1. 前言 在使用form表单的按钮时,点击按钮总是页面刷新,代码如下 <button class="layui-btn" lay-submit lay-filter=&qu ...

  8. Redis集群搭建的三种方式

    一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...

  9. 不可错过的java面试博客之java集合篇

    1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...

  10. P4016 负载平衡问题 网络流重温

    P4016 负载平衡问题 这个题目现在第二次做,感觉没有这么简单,可能是我太久没有写这种题目了,基本上都忘记了,所以我连这个是费用流都没有看出来. 有点小伤心,知道是费用流之后,我居然还拆点了. 这个 ...