深入讲解laravel6.0框架中的IOC和DI原理
官方解释:
IOC - 控制反转 DI - 依赖注入
通俗举例:
小明以前很穷,风餐露宿,居无定所。现在发财了,自己也想拥有属于自己的房子,这个时候小明想,要不回老家盖一栋房子,一来可以住,二来可以光宗耀祖,这个时候,小明需要自己去打造一栋房子;后来小明又想,为何不在城市里直接买套房呢,生活更加丰富多彩也方便。于是,小明就找了房产中介(IOC容器)买了房子(依赖注入),最终小明很快就住上了属于自己的房子,开心快乐极了。。。
小明 依赖 房子,小明从自己盖房子(自己“控制”房子)到找中介买房子(让中介“控制”房子),这就叫做控制反转,也就是IOC;而房产中介根据小明的需求,直接把房子提供给小明(当然小明付钱了),这就叫做依赖注入,也就是DI。
当然,这个房子并不是房产中介建设的,而是开发商建设的,这个开发商就是服务提供者。
三十年后,小明的这套房子格局跟不上时代了,住得不舒服,想改造/重新装修房子,但是时间成本太高了,于是,小明又找房产中介买了房子,小明又很快住上新房子了。。。这也体现了面向对象中类的单一职责原则。
目的
采用IOC思想和DI设计模式,主要目的是:解耦
开车式:异地恋。就算中间隔着一个距离,但也不影响真心的相爱着。
原生代码实现
传统写法
<?php
/**
* Create by PhpStorm
* User : Actor
* Date : 2019-11-01
* Time : 22:03
*/
/**
* Class 购房者
*/
class 购房者
{
private $姓名;
public function __construct($姓名)
{
$this->姓名 = $姓名;
}
public function 买房()
{
$新房 = new 商品房('0001', '四室两厅', '180平方米');
echo '我是'.$this->姓名."\r\n";
echo '我买了'. $新房->获取户型(). '的房子了'."\r\n";
echo '我买了'. $新房->获取面积(). '的房子了'."\r\n";
}
}
/**
* Class 商品房
*/
class 商品房
{
private $房源编号;
private $户型;
private $面积;
public function __construct($房源编号, $户型, $面积)
{
$this->房源编号 = $房源编号;
$this->户型 = $户型;
$this->面积 = $面积;
}
public function 获取面积()
{
return $this->面积;
}
public function 获取户型()
{
return $this->户型;
}
}
$大明 = new 购房者('大明');
$大明->买房();
?>
以上代码输出
[actor20:49:55] /projects/phpAdvanced$ php ioc/iocDriveCar.php
我是大明
我买了四室两厅的房子了
我买了180平方米的房子了
[actor20:56:18] /projects/phpAdvanced$
采用IOC和DI的思想来实现
<?php
/**
* Create by PhpStorm
* User : Actor
* Date : 2019-11-01
* Time : 22:03
*/
/**
* Class 购房者
*/
class 购房者
{
private $姓名;
public function __construct($姓名)
{
$this->姓名 = $姓名;
}
public function 买房(商品房 $新房)
{
echo '我是'.$this->姓名."\r\n";
echo '我买了'. $新房->获取户型(). '的房子了'."\r\n";
echo '我买了'. $新房->获取面积(). '的房子了'."\r\n";
}
}
/**
* Class 商品房
*/
class 商品房
{
private $房源编号;
private $户型;
private $面积;
public function __construct($房源编号, $户型, $面积)
{
$this->房源编号 = $房源编号;
$this->户型 = $户型;
$this->面积 = $面积;
}
public function 获取面积()
{
return $this->面积;
}
public function 获取户型()
{
return $this->户型;
}
}
/**
* 房产中介,就是我们讲的ioc
* Class 房产中介
*/
class 房产中介
{
private $在售房源 = [];//这个类似于laravel的Container对象中的$bindings
private $认筹房源 = [];//类似于laravel的Container对象中的$resolved
private $公租房 = [];//类似于laravel的Container对象中的$instances
private $网红房源 = [];//类似于laravel的Container对象中的$aliases / $abstractAliases
private $意向购房群体 = [];
public function 预售登记($户型, $详细信息)
{
$this->在售房源[$户型] = $详细信息;
}
public function 获取在售房源($户型)
{
return ($this->在售房源[$户型])();//因为是闭包,所以,要增加()来执行闭包函数
}
public function 意向登记($意向人, $个人信息)
{
$this->意向购房群体[$意向人] = $个人信息;
}
public function 获取意向人信息