分为如下两部分:

  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. cocos2dx新建项目

    首先你得下载好cococs2dx,还有python2.x版本,还有vs2017 然后cmd在你Cocos2dx的路径下输入 python setup.py 然后你就回车回车回车 然后重新打开cmd 这 ...

  2. java中的Atomic类

    文章目录 问题背景 Lock 使用Atomic java中的Atomic类 问题背景 在多线程环境中,我们最常遇到的问题就是变量的值进行同步.因为变量需要在多线程中进行共享,所以我们必须需要采用一定的 ...

  3. 模块sys,os

    Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的. 在Pyt ...

  4. Ribbon 框架简介及搭建

    2019独角兽企业重金招聘Python工程师标准>>> Ribbon简介 1.  负载均衡框架,支持可插拔式的负载均衡规则 2.  支持多种协议,如HTTP.UDP等 3.  提供负 ...

  5. 如何创建和部署自己的EOS代币

    本文我们将弄清楚什么是EOS代币以及如何自己创建和部署EOS代币. 与以太坊相反,EOS带有即插即用的代币智能合约.以太坊拥有ERC20智能合约,EOS拥有eosio.token智能合约.Eosio. ...

  6. Unity碰撞检测

    2019独角兽企业重金招聘Python工程师标准>>> 我们在用unity做开发的时候,会遇到要用到碰撞检测的问题,比如说,物体撞到墙壁,子弹打到物体等等,所以这里简单介绍一下uni ...

  7. HTML 页面跳转的五种方法

    H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...

  8. file download hash mismatch

    在linux中使用cmake时,遇到了"file download hash mismatch",同时status显示"unsupported protocol" ...

  9. 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库

    支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...

  10. C. Game with Chips(陷阱暴力题)

    \(为什么说这是个陷阱呢??\) \(因为不管你脑洞多大,数学多好,都发现会束手无策\) \(每移动一次不知道往哪个方向,不知道先访问哪个点,同时要记录所有点的坐标,记录每个点是否访问过目标点.... ...