91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中的相關服務容器與依賴注入的思路

發布時間:2020-07-09 15:37:55 來源:億速云 閱讀:206 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關PHP中的相關服務容器與依賴注入的思路,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

                                                           PHP中的相關服務容器與依賴注入的思路

依賴注入

當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

在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中的相關服務容器與依賴注入的思路了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新竹市| 乌拉特中旗| 缙云县| 衡阳县| 沧源| 纳雍县| 榆社县| 乌鲁木齐县| 长子县| 太白县| 红原县| 靖江市| 阿图什市| 永川市| 新巴尔虎左旗| 白沙| 桂东县| 巨鹿县| 胶南市| 东乡族自治县| 巫山县| 佛学| 文成县| 西畴县| 西和县| 准格尔旗| 南宁市| 兴文县| 开远市| 凯里市| 宝鸡市| 兴和县| 宁晋县| 淅川县| 贵阳市| 昌乐县| 文登市| 温州市| 且末县| 杨浦区| 烟台市|