PHP中的服务容器与依赖注入的思想-php教程

资源魔 29 0
依赖注入

当A类需求依赖于B类,也就是说需求正在A类中实例化B类的工具来应用时分,假如B类中的性能发作扭转,也会招致A类中应用B类之处也要随着修正,招致A类与B类高耦合。这个时分处理形式是,A类应该去依赖B类的接口,把详细的类的实例化交给内部。

就拿咱们营业中罕用的告诉模块来讲。

<?php
/**
 * 界说了一个音讯类
 * Class Message 
 */
class  Message{
  public function seed()
  {
      return 'seed email';
  }
}
/*
 * 定单孕育发生的时分 需求发送音讯
 */
class Order{
    protected $messager = '';
    function __construct()
    {
        $this->messager = new Message();
    }
    public function seed_msg()
    {
        return $this->messager->seed();
    }
}
$Order = new Order();
$Order->seed_msg();

下面的代码是咱们传统的写法。起首由个音讯发送的类。而后正在咱们需求发送音讯之处,挪用发送音讯的接口。有一天你需求增加一个发送短信的接口以餍足没有同的需要。那末你会发现你要再Message类外面做修正。一样也要再Order类外面做修正。这样就显患上很费事。这个时分就有了依赖注入的思绪。上面把代码做一个调整

<?php
/**
 * 为了束缚咱们先界说一个音讯接口
 * Interface Message
 */
interface  Message{
  public function seed();
}
/**
 * 有一个发送邮件的类
 * Class SeedEmail
 */
class SeedEmail implements Message
{
    public function seed()
    {
        return  'seed email';
        // TODO: Implement seed() method.
    }
}
/** 
 *新增一个发送短信的类
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return 'seed sms';
        // TODO: Implement seed() method.
    }
}
/*
 * 定单孕育发生的时分 需求发送音讯
 */
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);
$Order->seed_msg();
//咱们需求发送短信的时分
$message = new SeedSMS();
$Order = new Order($message);
$Order->seed_msg();

这样咱们就完成了依赖注入的思绪,是否是很不便扩大了。

效劳容器

我了解的效劳容器就是一个主动孕育发生类的工场。

<?php
/**
 * 为了束缚咱们先界说一个音讯接口
 * Interface Message
 */
interface  Message{
    public function seed();
}
/**
 * 有一个发送邮件的类
 * Class SeedEmail
 */
class SeedEmail implements Message
{
    public function seed()
    {
        return  'seed email';
        // TODO: Implement seed() method.
    }
}
/**
 *新增一个发送短信的类
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return 'seed sms';
        // TODO: Implement seed() method.
    }
}
/**
 * 这是一个简略的效劳容器
 * 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');
$SMS->seed();

container是一个简略的效劳容器外面有bind,make两个办法

bind是向容器中绑定效劳工具。make则是沉着器中掏出工具。

bind

正在bind办法中需求传入一个 concrete 咱们能够传入一个实例工具或许是一个闭包函数。

能够看到我这全应用的是闭包函数,其实也能够这样写

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

前面这类写法与闭包相比的区分就是咱们需求先实例化工具能力往容易中绑定效劳。而闭包则是咱们应用这个效劳的时分才去实例化工具。能够看出闭包是有不少的劣势的。

make

make办法就沉着器中进来办法。外面起首判别了instances变量中能否有以后和存正在的效劳工具,假如有间接前往。假如不那末会经过 call_user_func_array前往一个工具.

更多的PHP相干常识,请拜访PHP中文网!

以上就是PHP中的效劳容器与依赖注入的思维的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!