分为如下两部分:

  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. Linux网络服务第五章NFS共享服务

    1.笔记 NFS一般用在局域网中,网络文件系统c/s格式 服务端s:设置一个共享目录 客户端c:挂载使用这个共享目录 rpc:111远程过程调用机制 Showmount -e:查看共享目录信息 def ...

  2. Java高效开发IntelliJ IDEA 2019.1 新特性

    1. 重构类.文件.符号,Action 搜索 IntelliJ IDEA(以下简称 IDEA) 中的搜索可以分为以下几类 类搜索,比如 Java,Groovy,Scala 等类文件 文件搜索,类文件之 ...

  3. resetlogs 打开数据库时新生成日志位置问题

    若系统中缺少联机日志,以resetlogs方式重建控制文件,那么当我们以alter database open resetlogs方式打开数据库时,新生成的联机日志会位于何处? 一:下面分别讨论几种情 ...

  4. 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189

    阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...

  5. tarjan 算法应用

    主要讲证明,流程倒是也有 然后发现自己并不会严谨证明 其实后面一些部分流程还是挺详细 本来这篇blog叫做"图论部分算法证明",然后发现OI中的图论想完全用数学上的方法证明完全超出 ...

  6. 慎用ToLower和ToUpper,小心把你的系统给拖垮了

    不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~ 一: ...

  7. linux进程管理相关命令

    ps ps aux ps -ef | grep -E "supervisor|PPID"  top 可以按一定规则对top的结果进行排序 # 监控单一进程 top -p pid  ...

  8. 最长公共子串(Longest common substring)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...

  9. 多表同步 ES 的问题

    原始需求 对跨业务域数据提供联查搜索能力. 比如:对退款单提供根据退款单.退款状态.发货状态的联查,其中退款状态和发货状态是跨业务域. 比如:对订单提供根据订单号.订单状态.退款状态的联查,其中订单状 ...

  10. Java return 关键字

    一.基本概念 return一方面用在循环语句中来结束循环,另一方面用来终止函数的执行或者退出类的方法,并把控制权返回该方法的调用者.如果方法有返回类型,则return的返回该类型的值:如果没有返回值, ...