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