10分钟理解依赖注入

简介: 看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。 业务场景 小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。 代码演示 根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed和$

看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。

业务场景

小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。

代码演示

根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed$distance。所有有了如下代码:

interface travelInterface{
 
    public function __construct($speed, $distance);
 
    public function run();
}
 
abstract class travel implements travelInterface{
     
    protected $speed; // 最高时速
    protected $distance; // 最远路程
 
    public function __construct($speed, $distance)
    {
        $this->speed = $speed;
        $this->distance = $distance;
    }
     
}
 
class drive extends travel{
     
    public function run()
    {
        echo "自驾游";
    }
}
 
class walk extends travel{
     
    public function run()
    {
        echo "徒步旅行";
    }
}

如果是选择自驾游

class human
{
    protected $travel; // 出行方式
 
    public function __construct()
    {
        $this->travel = new drive(60,1000);
    }
 
    public function traveling(){
        $this->travel->run();
    }
}
 
$xiaoming = new human();
$xiaoming->traveling();

那么,如果需要换一种出行方式的时候,则需要修改human类。这里看起来修改非常简单,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修改。

就说下依赖注入的基础方式

class human
{
    protected $travel; // 出行方式
 
    public function __construct(travel $travel)
    {
        $this->travel = $travel;
    }
 
    public function traveling(){
        $this->travel->run();
    }
}
 
$travel = new drive(60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

什么是依赖注入

简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。

换一种通过配置文件来实现控制反转

$config = [
    "travel" => drive::class,
];
 
$travel = new $config["travel"](60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();

通过上面的方式,以什么方式旅行,只需要修改配置$config就行。

这在我们PHP里感触不明显,觉得修改$config和修改$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。起到了解耦的作用。

虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。

原文地址:https://mengkang.net/790.html




目录
相关文章
|
10月前
|
数据采集 存储 缓存
PHP爬虫的使用与开发
本文深入探讨了PHP爬虫的使用与开发,涵盖基本原理、关键技术、开发实践及优化策略。从发送HTTP请求、解析HTML到数据存储,再到处理反爬机制,全面指导读者构建高效可靠的爬虫程序。
210 3
|
Java API PHP
(转载)为什么不推荐使用swoole和hyperf官方框架
(转载)为什么不推荐使用swoole和hyperf官方框架
5019 0
|
11月前
|
IDE PHP 开发工具
除了Xdebug,还有哪些常用的PHP调试工具?
这些调试工具各有特点,开发者可以根据自己的需求和习惯选择适合的工具。在实际开发中,结合多种工具的使用往往能够更全面、更深入地进行调试,提高开发效率和代码质量。同时,随着技术的不断发展,新的调试工具也在不断涌现,开发者需要保持学习和关注,以便及时掌握最新的调试技术和工具。
319 1
|
11月前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
8月前
|
PHP 数据库
PHP在线聊天系统源码
PHP在线聊天系统源码
272 18
|
11月前
|
JSON 数据挖掘 API
如何使用PHP开发1688商品详情API接口
本文详细介绍了如何使用PHP开发1688商品详情API接口,涵盖从注册账号、申请权限、配置环境到代码实现的全过程。通过设置请求头、参数及生成签名,利用cURL或GuzzleHttp库发送请求并处理响应,最终实现商品详情数据的获取与应用,助力电商发展。
129 1
|
运维 安全 网络协议
运维.索引引擎ElasticSearch.记录一个小异常:received plaintext http traffic on an https channel
运维.索引引擎ElasticSearch.记录一个小异常:received plaintext http traffic on an https channel
869 0
|
前端开发 NoSQL JavaScript
Hyperf 的协程
Hyperf 是运行于 `Swoole 4` 的协程和 `Swow` 协程之上的,这也是 Hyperf 能提供高性能的其中一个很大的因素,本文对协程进行了解释和使用演示
1892 0
|
PHP 开发工具
swoole-cli常见问题
由于系统的cacert证书有问题,可能会报该错误,在fpm环境的时候我们需要先下载好cacert.pem文件,并在php.ini中声明路径
547 0
hyperf| 编码实践一: 基础篇
整个团队使用 hyperf 开发已经超过半年, 积累了一些最佳实践和规约, 方便团队后续开发, 提供给大家参考~
980 0