依赖注入 DI
其实实质上是指对类的依赖通过结构器实现 主动注入
- 艰深来说,就是你以后操作一个类,然而这个类的某些办法或者性能不是单单只靠这个类就能实现的,而是要
借助另一个类
的能力实现的
- 最间接的标记就是传参数据为对象的时候。严格来说,你
想在一个类中操作另一个类
,这两个类之间造成了相互依赖关系,传参的形式叫 注入
- 在未应用依赖注入的时候,
php
须要在一个类中应用另一个类的时候,往往都会进行如下操作
- 比方我在
container
类中须要用到 adapter
类,就须要在应用之前进行实例化
- 如果须要用到大量的外部类,这就会造成了
耦合度太高
,很容易造成前期的 保护艰难
- 艰深的来讲,也就是
container
脱离不了外部类去工作,这就叫 耦合度太高
<?php
class container
{
private $adapter;
public function __construct()
{$this->adapter = new adapter();
}
}
- 下面的代码耦合度太高,导致了
依赖注入
的呈现,次要是为了 解耦合
- 如下案例,咱们只须要将所须要操作的类对象传入即可
依赖注入
操作的参数是 对象
,而不是一般参数,是不是有更好的了解了
- 然而这样的简略依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易
凌乱
<?php
class container
{
private $adapter;
public function __construct(adapter $adapter)
{$this->adapter = $adapter;}
}
- 为了解决下面
参数凌乱
的问题,这时候,依赖注入进行了优化
通过魔术办法,__get
去设置对象
- 这时候,咱们就能够解决依赖太多,参数凌乱的问题了
<?php
class container
{public $instance = [];
public function __set($name, $value)
{$this->instance[$name] = $value;
}
}
$container = new container();
$container->adapter = new adapter();
$container->autofelix = new autofelix();
- 咱们先定义一个
容器类
,次要用来向容器中 注入
你想要操作的类
- 应用的时候,只须要传容器这一个
对象
即可
<?php
class container
{public $instance = [];
public function __set($name, $value)
{$this->instance[$name] = $value;
}
}
class adapter
{public $name = '我是调度器';}
$container = new container();
$container->adapter = new adapter();
class autofelix
{
private $container;
public function __construct(container $container)
{$this->container = $container;}
public function who($class)
{return $this->container->instance[$class]->name;
}
}
$autofelix = new autofelix($container);
$who = $autofelix->who('adapter');
var_dump($who); // 我是调度器
- 在下面的利用中,咱们
间接
将实例化后的对象注入容器中
- 这样会导致,所有的对象还没有被应用就会被实例化一遍,造成
资源的损耗
- 咱们能够
传入闭包
,这样对象就不会被实例化而注入,当你本人须要应用的时候,再去实例化,就能够缩小 服务器资源的损耗
了
<?php
$container = new container();
$container->adapter = new adapter();
// 高阶优化
$container = new container();
$container->adapter = function () {return new adapter();
};