当前位置: 首页 > news >正文

Thinkphp 6.0容器和依赖注入

本节课我们来学习一下依赖注入的用法,以及容器的用法。
一.依赖注入
1. 手册对依赖注入比较严谨的说明,具体如下:
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作
方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL
请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
2. 先看一个小例子,了解一下依赖注入的写法,创建一个模型;
namespace app\model;
use think\Model;
class One extends Model
{
public $username = 'Mr.Lee';
}

3. 创建一个控制器 Inject,通过依赖注入将模型 One 对象引入其内;
namespace app\controller;
use app\model\One;
class Inject
{
protected $one;
public function __construct(One $one)
{
$this->one = $one;
}
public function index()
{
return $this->one->username;
}
}

4. 依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束)
5. 而传递的对象背后的那个类被自动绑定并且实例化了,这就是依赖注入;
二.容器
1. 依赖注入的类统一由容器管理的,大多数情况下是自动绑定和自动实例化的;
2. 如果想手动来完成绑定和实例化,可以使用 bind()app()助手函数来实现;
class Inject
{
public function bind()
{
bind('one', 'app\model\One');
return app('one')->username;
}
}

6. bind('one','...')绑定类库标识,这个标识具有唯一性,以便快速调用;
7. app('one')快速调用,并自动实例化对象,标识严格保持一致包括大小写;
8. 自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则:
//每次调用总是会重新实例化
$one = app('one',[], true);
return $one->name;

9. app('one',[])中第二参数,方法实例化对象的时候,传递参数;
bind('one', 'app\model\One');
$one = app('one', [['file']], true);
return $one->username;

10. 当然,你也可以直接通过 app()绑定一个类到容器中并自动实例化;
return app('app\model\One')->username;

11. 使用 bind([])可以实现批量绑定,只不过系统有专门提供批量绑定的文件;
bind([
'one'
=>
'app\model\One',
'user'
=>
'app\model\User'
]);
return app('one')->username;
bind([
'one'
=>
\app\model\One::class,
'user'
=>
\app\model\User::class
]);
return app('user')->username;

12. ::class 模式,不需要单引号,而且需要在最前面加上\,之前的加不加都行;
13. 系统提供了 provider.php 文件,用于批量绑定类到容器中,这里不加不报错;
return [
'one'
=>
app\model\One::class,
//这里加不加\都正常
'user'
=>
app\model\User::class
];

14. 系统内置了很多常用的类库,以便开发者快速调用,具体如下:
15. 也就是说,实现同一个效果可以由容器的 bind()app()实现,也可以使用依赖
注入实现,还有 Facade(下节课重点探讨)实现,以及助手函数实现;

相关文章:

Thinkphp 6.0容器和依赖注入

本节课我们来学习一下依赖注入的用法,以及容器的用法。 一.依赖注入 1. 手册对依赖注入比较严谨的说明,具体如下: 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作 方法中一旦对参…...

Type javax.servlet.http.HttpServletRequest not present

运行环境 Swagger 3.0.0、springboot 3.0.0 产生原因&#xff1a; Swagger 3.0.0不支持spring3.0.0 两个解决方案&#xff1a; 1.降低springboot版本为2.x 2.放弃Swagger&#xff0c;使用 springdoc-openapi-starter-webmvc-ui 第二种解决方案&#xff1a; <dependen…...

一键配置Ubuntu的OpenHarmony基础编译环境

一键配置Ubuntu的OpenHarmony基础编译环境 一、配置前说明 该更新源仅适用于Ubuntu以下系列 Ubuntu18.04 Ubuntu20.04 Ubuntu22.04 强烈推荐Ubuntu20.04&#xff0c;本人使用的一直都是Ubuntu20.04 wsl的配置参见 如果使用的window wsl安装&#xff0c;则关于wsl配置可参考&a…...

ASP网络求职招聘系统的设计与实现

本文主要介绍了ASP&#xff0c;数据库等相关知识&#xff0c;同时较为详尽的阐述了网络求职招聘系统的实现。本系统是使用基于HTML语言&#xff0c;嵌套JavaScript源代码的ASP编程技术来开发&#xff0c;并以IIS为服务平台实现网络求职招聘系统的构建。后台数据库选用的是ACCES…...

面试—C++《智能指针》常考点

目录 1.为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2 内存泄漏分类 2.3 如何检测内存泄漏 2.4如何避免内存泄漏 3.智能指针的使用及原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr 1.为什么需要智能指针 下…...

自动化测试方案编写思路

澄清问题: 目标&#xff1a;完成项目的自动化测试&#xff0c;设计一个方案&#xff0c;告诉领导打算怎么做&#xff1f;有哪些流程&#xff1f;花多长时间&#xff1f;需要哪些资源帮助&#xff1f;达到什么样的效果&#xff1f; 现状&#xff1a;需求分析-是个什么样的项目&a…...

【爬虫】案例04:某小说网多线程小说下载

时光轮回&#xff0c;冬去春来&#xff0c;转眼时间来到了2023年4月。天空沥沥淅淅下着小雨&#xff0c;逐渐拉上了幕布。此刻&#xff0c;正值魔都的下班高峰&#xff0c;从地铁站出来的女孩子纷纷躲到一边&#xff0c;手指飞快的划过手机屏幕&#xff0c;似乎在等待男朋友送来…...

海外独立站创业,Shopify网站如何引流

上一期给大家科普了如何快速创建自己的独立站 但往往独立站的难点在于站外引流 今天就给大家分享可以通过哪些渠道给独立站引流 - ⚡SEO排名&#xff1a;Google SEO的重要性不必多说&#xff0c;尽快注册歌账号&#xff0c;并开通Google Ad和Google Merchant Center&#…...

基于51单片机的室内湿度加湿温度声光报警智能自动控制装置设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机湿度 获取完整无水印论文报告&#xff08;内含电路原理图和源程序代码&#xff09; 在日常生活中加湿器得到了广泛的应用&#xff0c;但是现有的加湿器都需要手工控制开启和关闭并且不具备对室内空气温湿度的监测&am…...

解决:github爆 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

目录1. 背景2. 解决办法3. 原因&#xff0c;感兴趣的可以看看1. 背景 在拉取github上一个新项目的时候爆出 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 第一反应是电脑被黑了&#xff0c;传说中的中间人攻击(题外话一下&#xff0c;其实所有的代理软件都算是中间人哦~…...

【django开发手册】如何使用select_related进行一次连表查询

前言 Django是一款Python Web框架&#xff0c;致力于充分利用Python的简洁语法和语言特性来提高Web开发的效率。其中一个强大的特性是ORM&#xff08;Object-Relational Mapping&#xff09;&#xff0c;它使开发者可以使用Python代码而不是SQL查询语言来访问数据库。ORM不仅使…...

二、MySQL 基础

二、MySQL 基础 2.1 MySQL 简介 MySQL 是一款流行的开源数据库&#xff0c;也是一个关系型数据库管理系统 在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一 2.1.1 MySQL 发展历史 时间里程碑1996…...

项目中常用写法(前端)

项目中常用写法&#xff08;前端&#xff09;vue等待某个方法执行结束后&#xff0c;在执行判断js是不是undefined类型父组件传值到子组件state的值在标签中直接使用读取html&#xff0c;去掉字符串中的html标签字符串去掉中括号去掉双引号判断数组中是否包含某个值在某个ui框架…...

【面试】Java并发编程面试题

文章目录基础知识为什么要使用并发编程多线程应用场景并发编程有什么缺点并发编程三个必要因素是什么&#xff1f;在 Java 程序中怎么保证多线程的运行安全&#xff1f;并行和并发有什么区别&#xff1f;什么是多线程多线程的好处多线程的劣势&#xff1a;线程和进程区别什么是…...

HAProxy和Nginx搭建负载均衡器

负载均衡器是一个常用于分布式计算和网络应用中的系统组件&#xff0c;主要用于将客户端的请求分发到多个后端服务器上&#xff0c;以实现高可用性、高性能和可扩展性。常见的负载均衡器软件包括HAProxy和Nginx。 本文将介绍负载均衡器的原理和应用&#xff0c;以及使用HAProx…...

【集大成篇】数据类型( C、C++、Java )对比

1、C 语言数据类型关键字取值范围内存占用字符型char -128~1271整 型short-32768~327672int-2147483648~2147483647 (10位数&#xff09;4long (int)-2147483648~2147483647 (10位数&#xff09;4/8long long (int)-9223372036854775808~-9223372036854775807 (19位数&#xff…...

python编程:从键盘输入一个正整数n(n>2),请编程求解并输出大小最接近n的素数(n本身除外)

python编程实现&#xff1a;从键盘输入一个正整数n(n>2),请编程求解并输出大小最接近n的素数(n本身除外) 一、编程题目 从键盘输入一个正整数n(n>2)&#xff0c;请编程求解并输出大小最接近n的素数(n本身除外)。 (温馨提示&#xff0c;结果可能是2个哦) 二、输入输出样例…...

spring的面试宝典

1、什么是spring框架&#xff1f; spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框 架. 2.spring的作用? 方便解耦,简化开发&#xff0c;AOP编程支持&#xff0c;声明式事务支持&#xff0c;集成Juni…...

ArcGIS Pro地理空间数据处理完整工作流实训及python技术融合深度应用

查看原文>>>ArcGIS Pro地理空间数据处理完整工作流实训及python技术融合深度应用 目录 第一章、ArcGIS Pro基础讲解 第二章、数据获取、整合与管理 第三章、坐标系基础与地理配准 第四章、数据编辑与查询、拓扑检查 第五章、制图基础讲解 第六章、地理处理工具…...

(二)MyBatis源码阅读:SqlSession分析

一、核心流程 以下代码便是MyBatis的核心流程&#xff0c;我们从该代码出发分析MyBatis的源码。 Testpublic void test2() throws Exception{// 1.获取配置文件InputStream in Resources.getResourceAsStream("mybatis-config.xml");// 2.加载解析配置文件并获取Sq…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...