理解依赖注入(Dependency Injection)
2015-10-08 21:40
441 查看
理解依赖注入
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
相关文章推荐
- 剑指offer—把二叉树打印成多行
- break 和continue以及return的区别
- leetcode 21:Merge Two Sorted Lists(15-10-9)
- Generate Parentheses
- 018-继承-OC笔记
- 017-封装-OC笔记
- Sping面试题分析
- Ants (poj 3565 最小权匹配)
- Linux性能测试strace命令
- STM32--vs1053 WAV录音实现(wav保存在flash)
- 基于LNMP实现zabbix环境搭建
- Cocos2d-x中自定义XML的读取和写入
- 015-OC基础语法-OC笔记
- 016-类与对象-OC笔记
- 曾国藩的36字诀--字字千金
- 剑指offer—按之字形顺序打印二叉树
- 高项2015年下半年培训随堂作业(9月30日)
- 饼状图
- spring中配置EventBus
- c++多态的实现