理解依赖注入(Dependency Injection)
理解依赖注入
Yii2.0 使用了依赖注入的思想。正是使用这种模式,使得Yii2异常灵活和强大。千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了。
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
} function set($key, $value)
{
$_SESSION[$key] = $value;
} function get($key)
{
return $_SESSION[$key];
} // ...
}
这是一个操作session的类 , 下面的user类要使用session中的功能
class User
{
protected $storage; function __construct()
{
$this->storage = new SessionStorage();
} function setLanguage($language)
{
$this->storage->set('language', $language);
} function getLanguage()
{
return $this->storage->get('language');
} // ...
}
// 我们可以这么调用
$user = new User();
$user->setLanguage('zh');
这样看起来没什么问题,但是user里写死了SessionStorage类,耦合性太强,不够灵活,需解耦。
优化后的user类代码
class User
{
protected $storage; function __construct($storage)
{
$this->storage = $storage;
} function setLanguage($language)
{
$this->storage->set('language', $language);
} function getLanguage()
{
return $this->storage->get('language');
} // ...
}
调用方法:
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
不在User类中创建SessionStorage对象,而是将storage对象作为参数传递给User的构造函数,这就是依赖注入。
依赖注入的方式
依赖注入可以通过三种方式进行:
构造器注入 Constructor Injection
刚才使用的这也是最常见的:
class User
{
function __construct($storage)
{
$this->storage = $storage;
} // ...
}
设值注入 Setter Injection
class User
{
function setSessionStorage($storage)
{
$this->storage = $storage;
} // ...
}
属性注入 Property Injection
class User
{
public $sessionStorage;
} $user->sessionStorage = $storage;
下面是Yii2的例子
// create a pagination object with the total count
$pagination = new Pagination(['totalCount' => $count]); // limit the query using the pagination and retrieve the articles
$articles = $query->offset($pagination->offset)
->limit($pagination->limit)
->all();
参考:http://fabien.potencier.org/what-is-dependency-injection.html
理解依赖注入(Dependency Injection)的更多相关文章
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...
- 简明依赖注入(Dependency Injection)
前言 这是因特奈特上面不知道第几万篇讲依赖注入(Dependency Injection)的文章,但是说明白的却寥寥无几,这篇文章尝试控制字数同时不做大多数. 首先,依赖注入的是一件很简单的事情. 为 ...
- 14.AutoMapper 之依赖注入(Dependency Injection)
https://www.jianshu.com/p/f66447282780 依赖注入(Dependency Injection) AutoMapper支持使用静态服务定位构建自定义值解析器和自定 ...
- 依赖注入 | Dependency Injection
原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...
- Spring点滴七:Spring中依赖注入(Dependency Injection:DI)
Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Inje ...
- 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)
参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...
- AngularJS - 依赖注入(Dependency Injection)
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 依赖注入 依赖注入是软件设计模式中的一部分,用于处理组件是如何得到它说依赖的其它组件的. ...
- Spring之对象依赖关系(依赖注入Dependency Injection)
承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...
- MVC使用StructureMap实现依赖注入Dependency Injection
使用StructureMap也可以实现在MVC中的依赖注入,为此,我们不仅要使用StructureMap注册各种接口及其实现,还需要自定义控制器工厂,借助StructureMap来生成controll ...
随机推荐
- Vue动态实现评分效果
1.图片分为三种 on:half: off <style> .star{ font-size: 0; } .star-item{ display: inline-block; backg ...
- 7、Spring -Cloud-路由网管Spring Cloud Zuul
7.1.为什么需要Zuul Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用: 7.2.Zuul的工作原理 Zuul 是通过 Servlet 来实现的, Zuul 通过自定义的 Zuu!S ...
- 2、RabbitMQ-simplest thing(简单队列)
1.项目准备: 使用maven的依赖 <dependencies> <dependency> <groupId>com.rabbitmq</groupId&g ...
- [教程] macOS打开原生的NTFS读写功能
Mac本身实际上是支持原生的NTFS读写的,只不过这一功能被隐藏了,但是可以手动打开,这比第三方的的工具要安全得多,有时第三方工具可能会发生整个NTFS分区数据丢失的情况,下面是打开MAC原生NTFS ...
- C#回调实现的一般过程
C#回调实现的一般过程 C#的方法回调机制,是建立在委托基础之上的,下面给出它的典型实现过程. (一) 定义.声明回调 Delegate void DoSomeCallBack(type para); ...
- 【Git】将项目下的.git目录隐藏
将项目下的.git目录隐藏 在apache配置文件httpd.conf中添加配置: <Directory "${INSTALL_DIR}/www/mypro/.git"> ...
- java alibaba fastJson 遍历数组json
import java.util.*; import com.alibaba.fastjson.*; public class Test { public static void main(Strin ...
- Android之zip文件加密解压及进度条的实现
zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件 ...
- 【.net开发者自学java系列】使用Eclipse开发SpringMVC(3)
[.net开发者自学java系列]使用Eclipse开发SpringMVC(3) 标签(空格分隔): Spring RESTful 很久没继续学习java的spring了.接下来继续 回忆一下上个随笔 ...
- SVN搭建(linux 7)
第一步:通过yum命令安装svnserve,命令如下: >yum -y install subversion 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 若需查看s ...