当前位置:网站首页>一文搞懂│php 中的 DI 依赖注入
一文搞懂│php 中的 DI 依赖注入
2022-08-02 15:39:00 【华为云】
什么是 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();};边栏推荐
- 【[USACO12MAR]Cows in a Skyscraper G】【状压DP && DFS】
- redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
- 2.3 - P、V、S机制
- Break the stereotype, DIY is your own unique mall
- 博世「求援」,毫米波雷达重构
- Brute-force cracking of the latest JVM interview questions of Meituan: unlimited execution
- 美团面试:如何设计一个注册中心?
- 再见Attention:建模用户长期兴趣的新范式
- IJCAI'22 推荐系统论文梳理
- 动态权重之多任务不平衡论文 (一)
猜你喜欢

06-线程池(3大方法、7大参数,4种拒绝策略)

第十四天笔记

提高测试覆盖率的四大步骤

CefSharp practical demonstration

.NET性能优化-使用SourceGenerator-Logger记录日志

机械臂速成小指南(十四):多项式插值轨迹规划

带你了解MySQL数据库

Basic management of system storage -- mounts, partitions, user quotas

UnicodeEncodeError: 'gbk' codec can't encode character '\u2022' in position 178: illegal multibyte s

2.4 - 三态模型
随机推荐
IJCAI'22 推荐系统论文梳理
tiup mirror publish
How to use PHP to implement lexical analyzer and custom language
美团面试:如何设计一个注册中心?
MySQL-1-环境部署
绝对最直白的MySQL MVCC机制总结,免费拿走
NC52 有效括号序列
CWE4.8:2022年危害最大的25种软件安全问题
JZ81 调整数组顺序使奇数位于偶数前面(二)-相对位置变化
博世「求援」,毫米波雷达重构
Apache management and web optimization
提高测试覆盖率的四大步骤
不平衡之钥: 重采样法何其多
Idea中运行sparkSQL
redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
MPLS实验
软件成分分析:华为云重磅发布开源软件治理服务
太帅了!我用炫酷大屏展示爬虫数据!
【服务器数据恢复】Raid阵列更换故障硬盘后数据同步失败的数据恢复案例
JZ11 旋转数组的最小数字