依赖注入

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

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

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

 
 
  1. interface travelInterface{
  2. public function __construct($speed, $distance);
  3. public function run();
  4. }
  5. abstract class travel implements travelInterface{
  6. protected $speed; // 最高时速
  7. protected $distance; // 最远路程
  8. public function __construct($speed, $distance)
  9. {
  10. $this->speed = $speed;
  11. $this->distance = $distance;
  12. }
  13. }
  14. class drive extends travel{
  15. public function run()
  16. {
  17. echo "自驾游";
  18. }
  19. }
  20. class walk extends travel{
  21. public function run()
  22. {
  23. echo "徒步旅行";
  24. }
  25. }

下面是选择自驾游的代码

 
 
  1. class human
  2. {
  3. protected $travel; // 出行方式
  4. public function __construct()
  5. {
  6. $this->travel = new drive(60,1000);
  7. }
  8. public function traveling(){
  9. $this->travel->run();
  10. }
  11. }
  12. $xiaoming = new human();
  13. $xiaoming->traveling();

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

 
 
  1. class human
  2. {
  3. protected $travel; // 出行方式
  4. public function __construct(travel $travel)
  5. {
  6. $this->travel = $travel;
  7. }
  8. public function traveling(){
  9. $this->travel->run();
  10. }
  11. }
  12. $travel = new drive(60,1000);
  13. $xiaoming = new human($travel);
  14. $xiaoming->traveling();

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

 
 
  1. $config = [
  2. "travel" => drive::class,
  3. ];
  4. $travel = new $config["travel"](60,1000);
  5. $xiaoming = new human($travel);
  6. $xiaoming->traveling();

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值