PHP中的相关服务容器与依赖注入的相关解析

互联网 19-6-18

依赖注入

当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。

就拿我们业务中常用的通知模块来说。

常规

<?php  /**  * 定义了一个消息类  * Class Message   */  class  Message{    public function seed()   {       return '灰太狼准备吃羊';   }  }  /*  * 订单产生的时候 需要发送消息  */ class Order{      protected $messager = '';      function __construct()     {         $this->messager = new Message();     }      public function seed_msg()     {         return $this->messager->seed();     } }  $Order = new Order(); echo $Order->seed_msg();

上面的代码是我们传统的写法。首先由个消息发送的类。然后在我们需要发送消息的地方,调用发送消息的接口。有一天你需要添加一个发送短信的接口以满足不同的需求。那么你会发现你要再Message类里面做修改。同样也要再Order类里面做修改。这样就显得很麻烦。这个时候就有了依赖注入的思路。

赖注入的思路

<?php  /**  * 为了约束我们先定义一个消息接口  * Interface Message  */  interface  Message{   public function seed(); }  /**  * 有一个发送邮件的类  * Class SeedEmail  */ class SeedEmail implements Message {     public function seed()     {         return  '灰太狼发邮件给红太狼说要吃烤全羊';     } }  /**   *新增一个发送短信的类  * Class SeedSMS  */ class SeedSMS implements Message {     public function seed()     {         return  '灰太狼发短信给红太狼说要吃烤全羊';     } }  /*  * 订单产生的时候 需要发送消息  */  class Order{      protected $messager = '';      function __construct(Message $message)     {         $this->messager = $message;     }      public function seed_msg()     {         return $this->messager->seed();     }  }  //我们需要发送邮件的时候 $message = new SeedEmail(); //将邮件发送对象作为参数传递给Order $Order = new Order($message); echo $Order->seed_msg();  echo "\n";  //我们需要发送短信的时候 $message = new SeedSMS(); $Order = new Order($message); echo $Order->seed_msg();

我理解的服务容器就是一个自动产生类的工厂。

服务容器

<?php  /**  * 为了约束我们先定义一个消息接口  * Interface Message  */ interface  Message{     public function seed(); }  /**  * 有一个发送邮件的类  * Class SeedEmail  */ class SeedEmail implements Message {     public function seed()     {         return  '灰太狼发邮件给红太狼说要吃烤全羊';     } }  /**   *新增一个发送短信的类  * Class SeedSMS  */ class SeedSMS implements Message {     public function seed()     {         return  '灰太狼发短信给红太狼说要吃烤全羊';     } }  /**  * 这是一个简单的服务容器  * Class Container  */  class Container {      protected $binds;       protected $instances;      public function bind($abstract, $concrete)     {         if ($concrete instanceof Closure) {             $this->binds[$abstract] = $concrete;         } else {             $this->instances[$abstract] = $concrete;         }     }      public function make($abstract, $parameters = [])     {         if (isset($this->instances[$abstract])) {             return $this->instances[$abstract];         }         array_unshift($parameters, $this);         return call_user_func_array($this->binds[$abstract], $parameters);     } }  //创建一个消息工厂 $message = new  Container();  //将发送短信注册绑定到工厂里面 $message->bind('SMS',function (){      return   new  SeedSMS(); });  //将发送邮件注册绑定到工厂 $message->bind('EMAIL',function (){    return new  SeedEmail(); });  //需要发送短信的时候 $SMS  = $message->make('SMS'); echo $SMS->seed();  echo "\n";  $EMAIL  = $message->make('EMAIL'); echo $EMAIL->seed();

container是一个简单的服务容器里面有bind,make两个方法

bind是向容器中绑定服务对象。

make则是从容器中取出对象。

bind

$sms = new  SeedSMS(); $message->bind('SMS',$sms);

后面这种写法与闭包相比的区别就是我们需要先实例化对象才能往容易中绑定服务。而闭包则是我们使用这个服务的时候才去实例化对象。可以看出闭包是有很多的优势的。

make

更多PHP相关技术文章,请访问PHP教程栏目进行学习!

以上就是PHP中的相关服务容器与依赖注入的相关解析的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 依赖注入
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:Tideways、xhprof 和 xhgui 打造 PHP 非侵入式监控平台

相关资讯