欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP中的依賴注入和服務(wù)容器怎么實(shí)現(xiàn)

PHP中的依賴注入和服務(wù)容器怎么實(shí)現(xiàn)?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注重慶網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)企業(yè)網(wǎng)站設(shè)計(jì)方案、改版、費(fèi)用等問題,行業(yè)涉及攪拌罐車等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

依賴注入

依賴注入其實(shí)本質(zhì)上是指對(duì)類的依賴通過構(gòu)造器完成自動(dòng)注入,例如在控制器架構(gòu)方法和操作方法中一旦對(duì)參數(shù)進(jìn)行對(duì)象類型約束則會(huì)自動(dòng)觸發(fā)依賴注入,由于訪問控制器的參數(shù)都來自于URL請(qǐng)求,普通變量就是通過參數(shù)綁定自動(dòng)獲取,對(duì)象變量則是通過依賴注入生成。

就拿我們業(yè)務(wù)中常用的通知模塊來說。

<?php
/**
 * 定義了一個(gè)消息類
 * Class Message 
 */
class  Message{
  public function seed()
  {
      return 'seed email';
  }
}
/*
 * 訂單產(chǎn)生的時(shí)候 需要發(fā)送消息
 */
class Order{
    protected $messager = '';
    function __construct()
    {
        $this->messager = new Message();
    }
    public function seed_msg()
    {
        return $this->messager->seed();
    }
}
$Order = new Order();
$Order->seed_msg();

上面的代碼是我們傳統(tǒng)的寫法。首先由個(gè)消息發(fā)送的類。然后在我們需要發(fā)送消息的地方,調(diào)用發(fā)送消息的接口。有一天你需要添加一個(gè)發(fā)送短信的接口以滿足不同的需求。那么你會(huì)發(fā)現(xiàn)你要再M(fèi)essage類里面做修改。同樣也要再Order類里面做修改。這樣就顯得很麻煩。這個(gè)時(shí)候就有了依賴注入的思路。下面把代碼做一個(gè)調(diào)整

<?php
/**
 * 為了約束我們先定義一個(gè)消息接口
 * Interface Message
 */
interface  Message{
  public function seed();
}
/**
 * 有一個(gè)發(fā)送郵件的類
 * Class SeedEmail
 */
class SeedEmail implements Message
{
    public function seed()
    {
        return  'seed email';
        // TODO: Implement seed() method.
    }
}
/** 
 *新增一個(gè)發(fā)送短信的類
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return 'seed sms';
        // TODO: Implement seed() method.
    }
}
/*
 * 訂單產(chǎn)生的時(shí)候 需要發(fā)送消息
 */
class Order{
    protected $messager = '';
    function __construct(Message $message)
    {
        $this->messager = $message;
    }
    public function seed_msg()
    {
        return $this->messager->seed();
    }
}
//我們需要發(fā)送郵件的時(shí)候
$message = new SeedEmail();
//將郵件發(fā)送對(duì)象作為參數(shù)傳遞給Order
$Order = new Order($message);
$Order->seed_msg();
//我們需要發(fā)送短信的時(shí)候
$message = new SeedSMS();
$Order = new Order($message);
$Order->seed_msg();

這樣我們就實(shí)現(xiàn)了依賴注入的思路,是不是很方便擴(kuò)展了。

服務(wù)容器

Laravel 提供了一個(gè)功能強(qiáng)大的 IoC 容器。這個(gè) IoC 容器在 Laravel 中被稱作服務(wù)容器,是整個(gè) Laravel 框架最核心的部分,在它的調(diào)度下,框架各個(gè)組件可以很好的組合在一起工作。實(shí)際上,Laravel 的Application 類就是一個(gè)繼承自 Container 的容器類,它就是整個(gè) Laravel 應(yīng)用的服務(wù)容器。

在 Laravel 應(yīng)用中,可以通過 App 門面來訪問服務(wù)容器,還可以通過輔助函數(shù) app() 來訪問,如果是在服務(wù)提供者(可以理解為一個(gè)專門用于綁定接口與實(shí)現(xiàn)到服務(wù)容器的地方)中,則一般通過 $this->app 來訪問容器。

我理解的服務(wù)容器就是一個(gè)自動(dòng)產(chǎn)生類的工廠。

<?php
/**
 * 為了約束我們先定義一個(gè)消息接口
 * Interface Message
 */
interface  Message{
    public function seed();
}
/**
 * 有一個(gè)發(fā)送郵件的類
 * Class SeedEmail
 */
class SeedEmail implements Message
{
    public function seed()
    {
        return  'seed email';
        // TODO: Implement seed() method.
    }
}
/**
 *新增一個(gè)發(fā)送短信的類
 * Class SeedSMS
 */
class SeedSMS implements Message
{
    public function seed()
    {
        return 'seed sms';
        // TODO: Implement seed() method.
    }
}
/**
 * 這是一個(gè)簡單的服務(wù)容器
 * 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);
    }
}
//創(chuàng)建一個(gè)消息工廠
$message = new  Container();
//將發(fā)送短信注冊(cè)綁定到工廠里面
$message->bind('SMS',function (){
     return   new  SeedSMS();
});
//將發(fā)送郵件注冊(cè)綁定到工廠
$message->bind('EMAIL',function (){
   return new  SeedEmail();
});
//需要發(fā)送短信的時(shí)候
$SMS  = $message->make('SMS');
$SMS->seed();

container是一個(gè)簡單的服務(wù)容器里面有bind,make兩個(gè)方法

bind是向容器中綁定服務(wù)對(duì)象。make則是從容器中取出對(duì)象。

bind

在bind方法中需要傳入一個(gè) concrete 我們可以傳入一個(gè)實(shí)例對(duì)象或者是一個(gè)閉包函數(shù)。

可以看到我這全使用的是閉包函數(shù),其實(shí)也可以這樣寫

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

后面這種寫法與閉包相比的區(qū)別就是我們需要先實(shí)例化對(duì)象才能往容易中綁定服務(wù)。而閉包則是我們使用這個(gè)服務(wù)的時(shí)候才去實(shí)例化對(duì)象??梢钥闯鲩]包是有很多的優(yōu)勢(shì)的。

make

make方法就從容器中出去方法。里面首先判斷了instances變量中是否有當(dāng)前以及存在的服務(wù)對(duì)象,如果有直接返回。如果沒有那么會(huì)通過 call_user_func_array返回一個(gè)對(duì)象.

關(guān)于PHP中的依賴注入和服務(wù)容器怎么實(shí)現(xiàn)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

分享題目:PHP中的依賴注入和服務(wù)容器怎么實(shí)現(xiàn)
文章來源:http://aaarwkj.com/article34/igiope.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司微信小程序、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站制作、面包屑導(dǎo)航網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
久久中文字幕日韩精品| 美女av在线免费观看| 国产成人拍国产亚洲精品| 成人高清乱码一区二区三区| 蜜臀av人妻一区二区三区| 内射久久一区二区亚洲| 国产女主播高清在线视频| 亚洲日本国产精品一区| 自拍偷拍亚洲精品偷一| 中文字幕日韩精品在线看| 日韩精品中文字幕影视| 熟女少妇a一区二区三区| 亚洲日本精品国产第一区| 欧美日本国产专区一区| 国产91精品网站在线| 久久国产亚洲欧美日韩精品| 91人妻人澡人人爽| 剧情av一区二区在线| 一区二区三区毛片av网站| 日韩精品国产专区一区| 人妻中出中文字幕一区二区| 中文字幕av日韩在线| 91亚洲精品综合久久| 欧美三级高清视频在线播放| 亚洲乱色熟女一区二区三区麻豆| 久久综合给合综合久久| 四虎精品永久在线视频| 日韩在线视频 一区二区三区| 国产精品三级av在线播放| 亭亭丁香激情五月涩久久| 全国最大成人免费视频| 日韩精品在线免费观看了| 男人的天堂av东京热一区| 国产麻豆剧传媒国产av| 在线高清中文字幕三区| 精品欧美自拍偷拍三区| 国产精品美女露脸av毛片| 国产成人性生交大片免费| 欧美精品黑人三级精品| 日韩欧美黄色三级视频| 欧美一区二区久久综合|