依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不开谁。
简单来说,a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么通过a的接口,把b传入;
通过a的构造,把b传入;
通过设置a的属性,把b传入;
这个过程叫依赖注入(DI)。
那么什么是IOC Container?
随着DI的频繁使用,要实现IOC,会有很多重复代码,甚至随着技术的发展,有更多新的实现方法和方案,那么有人就把这些实现IOC的代码打包成组件或框架,来避免人们重复造轮子。
所以实现IOC的组件或者框架,我们可以叫它IOC Container。
for example
创建使用类和工具类
//工具类1class OneTool
{
public function game($user)
{
echo $user."打开了游戏\n";
}
public function read($user)
{
echo $user."阅读\n";
}
public function video($user)
{
echo $user."看视频\n";
}
}
//使用类class Person
{
private $_age = "";
protected $_sex = "";
private $_name = "";
public function __construct()
{
$this->_name = "xiaohong";
}
//打游戏 public function game()
{
new OneTool()->game($this->_name);
}
//学习 public function read()
{
new OneTool()->read($this->_name);
}
//看视频 public function video()
{
new OneTool()->video($this->_name);
}
}
$person = new Ming();
$person->read();
$person->video();
$person->game();
人们可以使用工具1去做想做的事情,时代发展,工具1渐渐被淘汰,工具2上场,人们不得不改变自己的思维去使用工具2,将自己工具1的使用改为工具2,尽管过程很痛苦
//工具类2class TwoTool
{
public function travel($user)
{
echo $user."打开了游\n";
}
public function conversation($user)
{
echo $user."阅读\n";
}
public function teach($user)
{
echo $user."传授\n";
}
}
//使用类class Person
{
private $_age = "";
protected $_sex = "";
private $_name = "";
public function __construct()
{
$this->_name = "xiaohong";
}
public function conversation()
{
new TwoTool()->conversation($this->_name);
}
public function travel()
{
new TwoTool()->read($this->_name);
}
public function teach()
{
new TwoTool()->teach($this->_name);
}
}
人们有了工具2之后生活质量必须提高一档次,但是高质量生活后,也想慢下来歇歇,发现慢下来还要改变自己,太难了
这个时候人们就像办法如何可以把这种痛苦减少,交给第三方时间规划器就好使,控制反转,控制权不在自己手上,我不用天天操心是不是该做什么了,时间规划器弄好一切给我们,直接使用
class Person
{
private $_age = "";
protected $_sex = "";
private $_name = "";
public function __construct($tool)
{
$this->_name = "xiaohong";
$this->_tool = $tool;
}
//打游戏 public function game()
{
$this->_tool->read($this->_name);
}
//学习 public function read()
{
$this->_tool->read($this->_name);
}
//看视频 public function video()
{
$this->_tool->video($this->_name);
}
}