当前位置:网站首页>一文搞懂│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();};边栏推荐
猜你喜欢

Idea中运行sparkSQL

A tour of gRPC:06 - gRPC client straming 客户端流

05-读写锁、阻塞队列及四组API、同步队列

类的比较大小(Comparable -> compareTo(类自己实现接口),Comparator -> compare(新建一个类作为比较器))

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

【Codeforces Round #811 (Div. 3)】【题目解析+AK代码】

【wpf】ListView 和 ItemsControl 的一点区别

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

20 Lectures on Disassembly of Multi-merchant Mall System Functions-Platform Distribution Overview

Break the stereotype, DIY is your own unique mall
随机推荐
“绿色低碳+数字孪生“双轮驱动,解码油气管道站升级难点
Go-5-简单介绍fmt库
无线振弦采集仪远程修改参数方式
AI+BI+可视化,Sugar BI架构深度剖析
【[USACO12MAR]Cows in a Skyscraper G】【状压DP && DFS】
【[SCOI2005] 互不侵犯】【状压DP(含概念讲解)】
【服务器数据恢复】Raid阵列更换故障硬盘后数据同步失败的数据恢复案例
WWW'22 推荐系统论文之多任务与对比学习篇
24、wpf之布局(二)
软件测试面试中90%会遇到的问题:“你会搭建测试环境吗?”
Qt | 关于QPalette的使用
word公式复制到另一个word当中出现图片解决方案
let块级作用域,var变量提升
入门关于 switch case 的理解
VLAN实验
Qt reads Json files (including source code + comments)
Thinkpad E430c使用u盘安装系统
太帅了!我用炫酷大屏展示爬虫数据!
2.4 - 三态模型
一文搞懂│php 中的 DI 依赖注入