コンテナ内のサービスと思考のPHP注射に依存しています

依存性注入

 

機能の変更のクラスBは、カテゴリが従わなければならないクラスBの使用につながる場合は、クラスAの使用時間にオブジェクトクラスBをインスタンス化するために必要とされるクラスAクラスBに依存する場合には必要AとBの高い結合を入力する主要修正。この溶液をB、外部へのクラスの具体例である時間、タイプ依存インタフェースクラスです。

私たちのビジネスの通知モジュールは、一般的に使用されてください。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?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クラス。これは非常に面倒です。この時間は、アイデアの依存性注入があります。調整を行うためのコードをここに

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

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

だから我々は、依存性注入のアイデアを実現し、非常に便利に拡張されていません。

コンテナサービス

私は、サービスコンテナが自動的に生成されたクラスファクトリであることを理解します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

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

コンテナは、単純なサービスのバインドを持っているコンテナである、2つのメソッドを作ります

バインドバインディングサービスは、コンテナの対象です。オブジェクトがコンテナから削除されていることを確認。

練る

バインドを渡す必要の方法では、オブジェクトまたは閉鎖機能の具体的な例を渡すことができます。

実際に、あなたもこれを書くことができます私は、この全体の閉鎖機能が使用されて見ることができます

1

2

$sms = new  SeedSMS();

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

差の閉鎖と比べて後者の文言は、我々は簡単にサービスにバインドできるオブジェクトをインスタンス化する必要があるということです。クロージャは、オブジェクトをインスタンス化するときに、我々は、このサービスを使用することです。クロージャは多くの利点がある見ることができます。

メイク

この方法は、方法はコンテナから出ていきます。どちらが最初の直接的なリターンがある場合は、現在のクライアントだけでなく、既存のインスタンス変数があるか否かを判断します。その後、call_user_func_arrayによってオブジェクトを返しない場合。

おすすめ

転載: www.cnblogs.com/heyue0117/p/11812180.html