YII框架的依赖注入容器
依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象。
所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能。那么这个对象就依赖于被使用的对象。
例如:
/**
* 厨师
*/
class cook {
/**
* 制作食物
*/
public function cooking() {
$food = new food();
echo $food->get(),"汤<br/>";
}
}
/**
* 食材
*/
class food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}
厨师类 在 制作食物 的时候需要用到 食材类 提供食材,才能完成食物的制作。
所以厨师类依赖于食材类。
但是这种直接在类内部实例化一个对象的方式来得到对象,是一种强耦合的做法。
应该把食材的提供者(数据结构)与食物的制作方法(算法)进行分离。
再改动一下代码:
/**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材
*/
class food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}
改动之后的代码是在实例化一个厨师的时候就把食材类传递进去。
但是这个时候,如果改动了,food类,那么极有可能导致cook类不能得到食材。这个时候它们之间还是强耦合在一块。
况且厨师不可能总是做西红柿鸡蛋汤啊,他需要其它食材。
再改动一下代码:
/**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材接口
*/
interface food{
public function get();
}
/**
* 海鲜类食材
*/
class seafood implements food{
/**
* 提供食材
*/
public function get() {
return '鲜鱼';
}
}
/**
* 家禽类食材
*/
class fowlfood implements food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}
把 食材提供 用一个接口进行约定,然后各类食材都必须实现那个接口。
通过接口,把 cook 与 food 彻底分开。
这样我们的客户端代码就是:
$cook = new cook(new seafood);
$cook->cooking();
$cook = new cook(new fowlfood);
$cook->cooking();
这样在每次使用$cook对象的时候,都需要new一下 实现了food接口的类。
那么对于这种依赖的关系,如果能够让一个对象专门来处理,而不是手工去new一下food类。那么这种处理过程就叫依赖注入。
这个处理依赖关系的对象就是Yii框架中的叫“”容器”的对象。
下面是Yii中依赖注入容器的使用:
<?php
namespace app\controllers;
use yii\web\Controller;
use \YII; class TestController extends Controller
{
public function actionIndex() {
//实例化依赖注入容器
$container = new \yii\di\Container;
//设置food接口与具体的实现类之间的关系
$container->set('app\controllers\food','app\controllers\fowlfood');
//$container->set('app\controllers\food','app\controllers\seafood');
//通过依赖注入容器得到厨师对象
$cook = $container->get('app\controllers\cook');
$cook->cooking();
}
} /**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材接口
*/
interface food{
public function get();
}
/**
* 海鲜类食材
*/
class seafood implements food{
/**
* 提供食材
*/
public function get() {
return '鲜鱼';
}
}
/**
* 家禽类食材
*/
class fowlfood implements food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}
YII框架的依赖注入容器的更多相关文章
- YII框架的依赖注入容器与服务定位器简述
依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...
- yii依赖注入和依赖注入容器
依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...
- [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- yii2之依赖注入与依赖注入容器
一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
- IoC 依赖注入容器 Unity
原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期
生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...
随机推荐
- YII 的SPA 写法
'use strict'; var findToolbar = function () { return document.querySelector('#yii-debug-toolbar'); } ...
- [AIR] NativeExtension在IOS下的开发实例 --- ANE文件的打包(三)
来源:http://bbs.9ria.com/thread-102041-1-1.html 好了,前面的准备工作做的差不多了.此时我们应用有下面几个文件:extension.xml CoolEx ...
- 二十二、mysql索引原理详解
背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between a ...
- 修改ActiveMQ的内存大小
有时我们需要修改ActiveMQ的内存大小,防止内存溢出! 修改配置文件下-Xmx参数然后重启mq即可: /fs01/apache-activemq-5.15.0/bin/env ACTIVEMQ_O ...
- web-mini框架的基本实现(一)
本篇主要介绍WSGI-web-mini框架的基本实现,以及什么是WSGI协议.对于浏览器的资源请求服务端是如何处理的等相关知识: 一.浏览器资源请求 我们知道浏览器和web服务器之间是基于HTTP协议 ...
- Kubernetes-Istio之Gateway和VirtualService
1: 确定入口IP和端口 执行以下命令以确定Kubernetes集群是否在支持外部负载均衡器的环境中运行: kubectl get svc istio-ingressgateway -n istio- ...
- Python_变量作用域
1.变量作用域: def get_apple(name,*b): global totalCount totalCount=0 for num in b: print('............... ...
- jenkins+ant+jmeter接口自动化的持续集成
一.jmeter.jenkins安装 这里不再说明,请看上一个随笔!!! 链接:https://www.cnblogs.com/magicYJ/p/11839646.html 二.ant安装 下载地址 ...
- Kotlin枚举与委托深入详解
枚举: 基本上跟Java的差不多,这里就过一遍既可,如下: 还可以接收参数,如下: 枚举还可以定义方法,如下: 看下错误提示: 所以可以这样: 然后咱们再冒号之前定义对象,如下: 下面来使用一下: 当 ...
- python中while循环的基本使用
一.while循环 while 条件: 如果条件为True,会一直循环 代码块(循环体) else: 当上面的条件为假.才会执行 执行顺序:判断条件是否为真.如果真,执行循环 ...