### 容器
* 容器來更方便的管理類依賴及運行依賴注入。
* 容器類`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服務端