博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10分钟快速理解依赖注入
阅读量:5280 次
发布时间:2019-06-14

本文共 1722 字,大约阅读时间需要 5 分钟。

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

业务场景

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

代码演示

根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$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 "徒步旅行";    }}

 

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

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

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

什么是依赖注入。

简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。
换一种通过配置文件来实现控制反转

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();

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

这在我们PHP里感触不明显,觉得修改$config和修改$travel = new drive(60,1000)差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。(千锋PHP培训)起到了解耦的作用。
虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。

转载于:https://www.cnblogs.com/gaohj/p/6691909.html

你可能感兴趣的文章
用C#发送邮件的编程方法及实例代码分享
查看>>
Spring 读书笔记-----使用Spring容器(一)
查看>>
PHP24 自定义分页类
查看>>
android调用webservice接口获取信息
查看>>
fenby C语言 P28
查看>>
HDU 1026
查看>>
SVN版本合并技巧
查看>>
android 2048游戏、kotlin应用、跑马灯、动画源码
查看>>
织梦列表页获取当前链接和当前分页链接
查看>>
$.extend({},defaults, options) --(初体验三)
查看>>
[Codeforces 933B]A Determined Cleanup
查看>>
common.js
查看>>
SQLSERVER存储过程基本语法
查看>>
HDU 2067 小兔的棋盘
查看>>
HDU 1713 相遇周期
查看>>
淘宝质量属性场景分析
查看>>
MSYS2更换软件源
查看>>
一步步学习javascript基础篇(4):面向对象设计之创建对象(工厂、原型和构造函数等模式)...
查看>>
python,在已有的文件夹下创建新的时间文件夹。
查看>>
zz视频原理
查看>>