ホームページ  >  記事  >  バックエンド開発  >  PHP でのサービス コンテナーと依存関係注入の分析

PHP でのサービス コンテナーと依存関係注入の分析

不言
不言オリジナル
2018-07-06 13:55:383300ブラウズ

この記事では、主に PHP のサービス コンテナーと依存関係の注入について紹介します。これは参考になるものです。ここで共有します。必要な友人は参照してください。

Dependency Injection

#クラス A がクラス B に依存する必要がある場合、つまり、クラス B のオブジェクトを使用するためにクラス A でインスタンス化する必要がある場合、クラス B の関数が変更されると、クラス内でクラス B が使用されることになります。 A ~ も変更により、クラス A とクラス B は高度に結合されます。現時点での解決策は、クラス A がクラス B のインターフェースに依存し、特定のクラスのインスタンス化を外部に渡すことです。
私たちのビジネスで一般的に使用されている通知モジュールを考えてみましょう。

<?php

/**
 * 定义了一个消息类
 * Class Message 
 */
class  Message{

  public function seed()
  {
      return &#39;seed email&#39;;

  }
}
/*
 * 订单产生的时候 需要发送消息
 */
class Order{

    protected $messager = &#39;&#39;;

    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  &#39;seed email&#39;;

        // TODO: Implement seed() method.
    }

}

/** 
 *新增一个发送短信的类
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return &#39;seed sms&#39;;
        // TODO: Implement seed() method.
    }


}
/*
 * 订单产生的时候 需要发送消息
 */
class Order{

    protected $messager = &#39;&#39;;

    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  &#39;seed email&#39;;

        // TODO: Implement seed() method.
    }

}

/**
 *新增一个发送短信的类
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return &#39;seed sms&#39;;
        // 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(&#39;SMS&#39;,function (){
     return   new  SeedSMS();
});
//将发送邮件注册绑定到工厂
$message->bind(&#39;EMAIL&#39;,function (){
   return new  SeedEmail();
});
//需要发送短信的时候
$SMS  = $message->make(&#39;SMS&#39;);
$SMS->seed();

container は、2 つのメソッド bindmake
bind を備えた単純なサービス コンテナです。サービス オブジェクトをコンテナにバインドします。 makeはコンテナからオブジェクトを取り出すことです。

bind

bind メソッドでは、concrete を渡す必要があります。インスタンス オブジェクトまたはクロージャ関数を渡すことができます。 クロージャ関数を使用していることがわかります。実際、このように書くこともできます

$sms = new  SeedSMS();
$message->bind('SMS',$sms);
この後者の書き方とクロージャの違いは、オブジェクトをインスタンス化してからインスタンス化する必要があることです。簡単に進めることができます。このサービスを使用する場合、クロージャはオブジェクトのみをインスタンス化します。クロージャーには多くの利点があることがわかります。

make

makeメソッドはコンテナを終了するメソッドです。まず、instances 変数に現在および既存のサービス オブジェクトがあるかどうかを判断し、存在する場合は直接返します。そうでない場合は、call_user_func_array を通じてオブジェクトが返されます。 call_user_func_array の使い方については、PHP での call_user_func の使い方を確認してください

以上がこの記事の全内容ですので、皆様の学習の一助になれば幸いです。関連コンテンツの詳細については、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

PHP コンテナ Pimple 実行プロセスの分析

gitbash PHP 実行の中国語ランダム コーディングの解決策出力

以上がPHP でのサービス コンテナーと依存関係注入の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。