### 容器
* 容器来更方便的管理类依赖及运行依赖注入。
* 容器类`think\container`。容器类主要是维护`$instances`容器对象数组,和`$bind`容器绑定标识。
* 容器类 可通过容器绑定标识,利用反射机制进行实例化对象,并绑定到容器对象数组中。
* 手动绑定到容器标识`$this->app->bind('标识名', '类名')`, 也可直接绑定一个对象到容器中`$this->app->bind('标识名', '对象')`
* 配置文件绑定。 可通过app目录下`provider.php`文件,进行配置需要绑定到容器标识。在App实例化的时候,批量加载此文件,进行绑定。
### 依赖注入
* 利用容器类的反射机制进行实例化类的时候, 都支持依赖注入。如控制器架构方法,控制器操作方法,事件类的执行方法,中间件类的执行方法。或者使用`invoke()`助手函数,实例化对象。
* 将类绑定到容器标识的类,也可以支持依赖注入。
### 调用
* 可通过app对象直接调用容器中的对象,如`$this->app->http`。框架会自动再容器对象数组中,获取该对象,如果没有,则查找容器标识数组,找出对应的类,进行实例化返回,并存储这个实例到容器对象数组中。
### 依赖注入
### 容器
### 门面
文章目录
1.什么是依赖注入?
1.1 依赖注入的概念:
1.2 依赖注入的举例:
2.什么是容器?
2.1 容器的概念:
2.2 容器的举例:
3.门面是什么?
3.1 门面的概念:
3.2 门面的好处:
3.3框架已有的常用类的代理:
3.3 门面的举例:
4.依赖注入和门面的对比:
4.1 依赖注入的实现方式:
4.2 门面(静态代理)的实现方式:
4.3 使用父类的属性的实现方法:
以下是关于 《最新ThinkPHP 5.1全球首发视频教程》的第4章的笔记
1.什么是依赖注入?
1.1 依赖注入的概念:
依赖注入指的是将对象类型的数据以参数的方式传到一个方法的参数列表中
1.2 依赖注入的举例:
```
<?php
class Site
{
public $siteNum=123;
public function getNum()
{
return $this->siteNum;
}
}
//Site $site这里就是依赖注入,等同于在方法里面写$site=new Site();
function test(Site $site){
return $site->getNum();
}
```
2.什么是容器?
2.1 容器的概念:
在tp中可以把类注册进容器中,想用这个类的实例对象时,可用容器实例化一个类对象来使用。
2.2 容器的举例:
将Demo1注册进容器中,再用容器实例化一个Demo1对象。
```
<?php
namespace app\index\controller;
class Index
{
public function bindClass(){
//1.把Demo1这个类注册到容器中
//第一个参数是类的别名(可自定义),第二个参数是类的命名空间+类名
\think\Container::set('demo1','\app\index\controller\Demo1');
//2.把容器中的类实例化并取出
//第一个参数是类注册时的别名,第二个参数是类的构造函数所需的参数名=>参数值
$demo1=\think\Container::get('demo1',['num'=>456]);
//3.此时可以使用容器实例出的类对象来调用类方法
return $demo1->getName();
}
}
```
被注册的类Demo1
```
<?php
namespace app\index\controller;
class Demo1
{
private $num;
public function __construct($num){
$this->num=$num;
}
public function getName(){
return $this->num;
}
}
```
3.门面是什么?
3.1 门面的概念:
如果想实现静态的去调用一个类的所有的动态(和静态)方法,则可以定义一个Facade的子类,定义一个方法用于返回该类,就可以想调用类方法时,从动态调用$class->function()变成静态调用class::function()
3.2 门面的好处:
给所有的调用方式提供了一个同一的接口(都用静态调用的形式),代码清晰规范(不会到处都是对象),方便调试
3.3框架已有的常用类的代理:
其实tp框架中的常用类都定义了Facade类库(位置为\think\facade目录),定义后无需实例化就可以直接静态调用类的方法。
3.3 门面的举例:
Demo1类中有一个getNum的方法
```
<?php
namespace app\index\controller;
class Demo1
{
private $num=123;
public function getNum()
{
return $this->num;
}
}
```
创建一个Facade类的子类,用来静态代理Demo1类(建议同名因为便于管理)
```
<?php
namespace app\facade;
class Demo1 extends \think\Facade
{
//重写Facade类的getFacadeClass函数,直接返回本子类所代理的真正类的命名空间
protected static function getFacadeClass()
{
return '\app\index\controller\Demo1';
}
}
```
代理完毕,现在在别的类中可以直接静态调用Demo1的方法
```
<?php
namespace app\index\controller;
use app\facade\Demo1;
class Index
{
public function test(){
return Demo1::getNum();
}
}
```
如果上面的形式觉得不够灵活,可以换成动态绑定代理关系,如下:
首先让刚才创建的Facade的子类中的内容为空
```
<?php
namespace app\facade;
class Demo1 extends \think\Facade
{
}
```
然后在需要调用Demo1类的位置进行动态绑定bind(facade子类,子类所代理的类本身);
调用完bind()函数后就可以静态调用Demo1的动态方法了。
```
<?php
namespace app\index\controller;
class Index
{
public function test()
{
\think\Facade::bind('app\facade\Demo1','app\index\controller\Demo1');
return \app\facade\Demo1::getNum();
}
}
```
4.依赖注入和门面的对比:
假如目标是在一个控制器中获取GET请求参数
4.1 依赖注入的实现方式:
```
<?php
namespace app\index\controller;
class Index
{
public function test(\think\Request $request)
{
dump($request->get());
}
}
```
4.2 门面(静态代理)的实现方式:
```
<?php
namespace app\index\controller;
class Index
{
public function test()
{
dump(\think\facade\Request::get());
}
}
```
4.3 使用父类的属性的实现方法:
继承Controller后,使用Controller类中的保护型属性$request(这是Request类实例)
```
<?php
namespace app\index\controller;
class Index extends \think\Controller
{
public function test ()
{
dump($this->request->get());
}
}
```
- Golang
- Beego框架
- Gin框架
- gin框架介绍
- 使用Gin web框架的知名开源线上项目
- go-admin-gin
- air 热启动
- 完整的form表单参数验证语法
- Go 语言入门练手项目推荐
- Golang是基于多线程模型
- golang 一些概念
- Golang程序开发注意事项
- fatal error: all goroutines are asleep - deadlock
- defer
- Golang 的内建调试器
- go部署
- golang指针重要性
- 包(golang)
- Golang框架选型比较: goframe, beego, iris和gin
- GoFrame
- golang-admin-项目
- go module的使用方法及原理
- go-admin支持多框架的后台系统(go-admin.cn)
- docker gocv
- go-fac
- MSYS2
- 企业开发框架系统推荐
- gorm
- go-zero
- 优秀系统
- GinSkeleton(gin web 及gin 知识)
- 一次 request -> response 的生命周期概述
- 路由与路由组以及gin源码学习
- 中间件以及gin源码学习
- golang项目部署
- 独立部署golang
- 代理部署golang
- 容器部署golang
- golang交叉编译
- goravel
- kardianos+gin 项目作为windows服务运行
- go env
- 适用在Windows、Linux和macOS环境下打包Go应用程序的详细步骤和命令
- Redis
- Dochub
- Docker部署开发go环境
- Docker部署运行go环境
- dochub说明
- Vue
- i18n
- vue3
- vue3基本知识
- element-plus 表格单选
- vue3后台模板
- Thinkphp
- Casbin权限控制中间件
- 容器、依赖注入、门面、事件、中间件
- tp6问答
- 伪静态
- thinkphp-queue
- think-throttle
- thinkphp队列queue的一些使用说明,queue:work和queue:listen的区别
- ThinkPHP6之模型事件的触发条件
- thinkphp-swoole
- save、update、insert 的区别
- Socket
- workerman
- 介绍
- 从ThinkPHP6移植到Webman的一些技术和经验(干货)
- swoole
- swoole介绍
- hyperf
- hf官网
- Swoft
- swoft官网
- easyswoole
- easyswoole官网地址
- EASYSWOOLE 聊天室DEMO
- socket问答
- MySQL
- 聚簇索引与非聚簇索引
- Mysql使用max获取最大值细节
- 主从复制
- 随机生成20万User表的数据
- MySQL进阶-----前缀索引、单例与联合索引
- PHP
- 面向切面编程AOP
- php是单线程的一定程度上也可以看成是“多线程”
- PHP 线程,进程、并发、并行 的理解
- excel数据画表格图片
- php第三方包
- monolog/monolog
- league/glide
- 博客-知识网站
- php 常用bc函数
- PHP知识点的应用场景
- AOP(面向切面编程)
- 注解
- 依赖注入
- 事件机制
- phpspreadsheet导出数据和图片到excel
- Hyperf
- mineAdmin
- 微服务
- nacos注册服务
- simps-mqtt连接客户端simps
- Linux
- 切换php版本
- Vim
- Laravel
- RabbitMQ
- thinkphp+rabbitmq
- 博客
- Webman框架
- 框架注意问题
- 关于内存泄漏
- 移动端自动化
- 懒人精灵
- 工具应用
- render
- gitlab Sourcetree
- ssh-agent失败 错误代码-1
- 资源网站
- Git
- wkhtmltopdf
- MSYS2 介绍
- powershell curl 使用教程
- NSSM(windows服务工具)
- MinGW64
- 知识扩展
- 对象存储系统
- minio
- 雪花ID
- 请求body参数类型
- GraphQL
- js 深拷贝
- window 共享 centos文件夹
- 前端get/post 请求 特殊符号 “+”传参数问题
- 什么是SCM系统?SCM系统与ERP系统有什么区别?
- nginx 日志格式统一为 json
- 特殊符号怎么打
- 收藏网址
- 收藏-golang
- 收藏-vue3
- 收藏-php
- 收藏-node
- 收藏-前端
- 规划ITEM
- 旅游类
- 人脸识别
- dlib
- Docker&&部署
- Docker-compose
- Docker的网络模式
- rancher
- DHorse
- Elasticsearch
- es与kibana都docke连接
- 4种数据同步到Elasticsearch方案
- GPT
- 推荐系统
- fastposter海报生成
- elasticsearch+logstash+kibana
- beego文档系统-MinDoc
- jeecg开源平台
- Java
- 打包部署
- spring boot
- 依赖
- Maven 相关 命令
- Gradle 相关命令
- mybatis
- mybatis.plus
- spring boot 模板引擎
- SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
- Spring Cloud
- Sentinel
- nacos
- Apollo
- java推荐项目
- gradle
- Maven
- Nexus仓库管理器
- Python
- Masonite框架
- scrapy
- Python2的pip2
- Python3 安装 pip3
- 安全攻防
- 运维技术
- 腾讯云安全加固建议
- 免费freessl证书申请
- ruby
- homeland
- Protobuf
- GIT
- FFMPEG
- 命令说明
- 音频
- ffmpeg合并多个MP4视频
- NODEJS
- 开发npm包
- MongoDB
- php-docker-mongodb环境搭建
- mongo基本命令
- Docker安装MongoDB最新版并连接
- 少儿编程官网
- UI推荐
- MQTT
- PHP连接mqtt
- EMQX服务端
- php搭建mqtt服务端