国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Pimple相關(guān)的源碼

MSchumi / 3220人閱讀

摘要:已經(jīng)有了非常好的的相關(guān)解析,建議先看下一個(gè)簡單的依賴注入容器讀源碼筆記上讀源碼筆記下這里通過例子補(bǔ)充下核心方法的說明相關(guān)的類型服務(wù)類似單例工廠服務(wù)多個(gè)實(shí)例參數(shù)僅僅是保存一些變量保護(hù)參數(shù)匿名函數(shù)都會(huì)被認(rèn)為服務(wù),但是如果僅僅是想作為一個(gè)

已經(jīng)有了非常好的Pimple的相關(guān)解析,建議先看下:
Pimple - 一個(gè)簡單的 PHP 依賴注入容器
讀 PHP - Pimple 源碼筆記(上)
讀 PHP - Pimple 源碼筆記(下)

這里通過例子補(bǔ)充下核心方法的說明:
相關(guān)的類型:

服務(wù)(類似單例):

$container["session"] = function ($c) {
    return new Session($c["session_storage"]);
};

工廠服務(wù)(多個(gè)實(shí)例)

$container["session"] = $container->factory(function ($c) {
    return new Session($c["session_storage"]);
});

參數(shù)(僅僅是保存一些變量)

$container["cookie_name"] = "SESSION_ID";

保護(hù)參數(shù)(匿名函數(shù)都會(huì)被認(rèn)為【1服務(wù)】,但是如果僅僅是想作為一個(gè)參數(shù),則需要用此方法)

$container["random_func"] = $container->protect(function () {
    return rand();
});

set賦值相關(guān)源碼:

    public function offsetSet($id, $value)
    {
         //如果是被凍結(jié),則無法賦值
        if (isset($this->frozen[$id])) {
            throw new FrozenServiceException($id);
        }
        //存入values
        $this->values[$id] = $value;
        //存入keys
        $this->keys[$id] = true;
    }

用【1服務(wù)】來舉例,調(diào)用offsetSet方法后:

    $this->values["session"] = function ($c) {
        return new Session($c["session_storage"]);
    };
    $this->keys["session"] = true;

使用時(shí)$session=$container["session"];,此時(shí)調(diào)用offsetGet方法:

    public function offsetGet($id)
    {
        //$this->keys["session"]存在
        if (!isset($this->keys[$id])) {
            throw new UnknownIdentifierException($id);
        }

        if (
            isset($this->raw[$id])//$this->raw["session"],第一次調(diào)用是沒有的,所以為false,重復(fù)調(diào)用則為ture
            || !is_object($this->values[$id])//所有的匿名函數(shù)都是object,所以為false。對應(yīng)的情況【3參數(shù)】時(shí)為true
            || isset($this->protected[$this->values[$id]])//未調(diào)用protected方法,所以為false,對應(yīng)的情況【4保護(hù)參數(shù)】時(shí)為true
            || !method_exists($this->values[$id], "__invoke")//所有匿名函數(shù)存在__invoke方法,所以為false
        ) {
            //綜上,如果是第一次調(diào)用,不會(huì)執(zhí)行到這一步,如果是重復(fù)調(diào)用、參數(shù)、protected方法相關(guān)的,則會(huì)執(zhí)行
            return $this->values[$id];
        }
        //判定是不是多個(gè)實(shí)例,對應(yīng)【2工廠服務(wù)】,由于我們沒有調(diào)用factories方法,所以這一步也不會(huì)執(zhí)行
        if (isset($this->factories[$this->values[$id]])) {
            return $this->values[$id]($this);
        }
        
        //此時(shí)$raw就是function ($c) 這個(gè)匿名函數(shù)
        $raw = $this->values[$id];
        
        //重新賦值$this->values["session"],將$this傳入,相當(dāng)于function ($this),之所以把$this傳遞過來,是因?yàn)槟涿瘮?shù)中可能還包含其它的服務(wù),
        //例如上方的$c["session_storage"],$this傳入后相當(dāng)于$container["session_storage"],此時(shí)會(huì)觸發(fā)調(diào)用offsetGet此方法。
        $val = $this->values[$id] = $raw($this);
        
        //將原始的匿名函數(shù)存入$this->raw中,$this->raw["session"]此時(shí)有值,重復(fù)訪問時(shí)在上方判定時(shí)直接返回,相當(dāng)于單例模式
        $this->raw[$id] = $raw;
        
        //標(biāo)記已凍結(jié),已經(jīng)get后則不允許offsetSet或者extend了
        $this->frozen[$id] = true;
        
        //返回$this->values["session"]
        return $val;
    }

Pimple實(shí)現(xiàn)起來比較簡單,主要是通過匿名函數(shù)來實(shí)現(xiàn),沒有像yii2容器那樣支持普通類的構(gòu)造函數(shù)自動(dòng)解析依賴注入關(guān)系等,但是對于僅僅是調(diào)用各個(gè)組件來說也足夠用了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29558.html

相關(guān)文章

  • 讀 PHP - Pimple 源碼筆記(下)

    摘要:服務(wù)容器接口是的簡寫,由組織制定的規(guī)范,是開發(fā)的實(shí)踐標(biāo)準(zhǔn)。實(shí)現(xiàn)的容器類源碼很簡單,主要是傳入變量,然后設(shè)置這個(gè)兩個(gè)方法。原創(chuàng)文章,歡迎轉(zhuǎn)載。原文鏈接地址作者發(fā)表日期 接著上篇 還有一些內(nèi)容沒有寫,上篇已經(jīng)把關(guān)于 Pimple 最主要的代碼分析了一下,這篇主要是關(guān)于 PSR-11 兼容性的分析。 PSR-11 服務(wù)容器接口 PSR PSR 是 PHP Standard Recommend...

    KunMinX 評論0 收藏0
  • 讀 PHP - Pimple 源碼筆記(上)

    摘要:也就是閑時(shí)為了寫文章而寫的一篇關(guān)于源碼的閱讀筆記。是標(biāo)準(zhǔn)庫的縮寫,一組旨在解決標(biāo)準(zhǔn)問題的接口和類的集合。提供了一套標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu),一組遍歷對象的迭代器,一組接口,一組標(biāo)準(zhǔn)的異常,一系列用于處理文件的類,提供了一組函數(shù),具體可以查看文檔。 也就是閑時(shí)為了寫文章而寫的一篇關(guān)于 Pimple 源碼的閱讀筆記。Pimple 代碼有兩種編碼方式,一種是以 PHP 編寫的,另一種是以 C 擴(kuò)展編寫...

    cfanr 評論0 收藏0
  • Pimple - 一個(gè)簡單 PHP 依賴注入容器

    摘要:服務(wù)通過匿名函數(shù)定義,返回一個(gè)對象的實(shí)例定義一些服務(wù)請注意,匿名函數(shù)可以訪問當(dāng)前容器實(shí)例,從而允許引用其他服務(wù)或參數(shù)。如果要為所有調(diào)用返回不同的實(shí)例,請使用方法包裝你的匿名函數(shù)。 鏈接 官網(wǎng) WebSite GitHub - Pimple 這是 Pimple 3.x 的文檔。如果你正在使用 Pimple 1.x ,請查看 Pimple 1.x 文檔。閱讀 Pimple 1.x ...

    wemall 評論0 收藏0
  • Pimple Containter 容器使用實(shí)例代碼

    摘要:安裝代碼加載并實(shí)例化參數(shù)存儲(chǔ)單例存儲(chǔ)非單例存儲(chǔ)存儲(chǔ)匿名函數(shù)獲取匿名函數(shù)服務(wù)提供者文檔官網(wǎng)文檔 Pimple/Container 安裝 composer require pimple/pimple: ^3.0 代碼 加載并實(shí)例化 require __DIR__ . /vendor/autoload.php; $pc = new PimpleContainer(); 參數(shù)存儲(chǔ) $pc[ap...

    maochunguang 評論0 收藏0
  • PHP容器--Pimple運(yùn)行流程淺析

    摘要:實(shí)際上,閉包和匿名函數(shù)是偽裝成函數(shù)的對象。容器流程淺析是社區(qū)中比較流行的容器。服務(wù)提供者服務(wù)提供者是連接容器與具體功能實(shí)現(xiàn)類的橋梁。服務(wù)提供者需要實(shí)現(xiàn)接口所有服務(wù)提供者必須實(shí)現(xiàn)接口方法。但已經(jīng)完成了服務(wù)提供者的注冊工作。 需要具備的知識點(diǎn) 閉包 閉包和匿名函數(shù)在PHP5.3.0中引入的。 閉包是指:創(chuàng)建時(shí)封裝周圍狀態(tài)的函數(shù)。即使閉包所處的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在。 理論上...

    RobinTang 評論0 收藏0

發(fā)表評論

0條評論

MSchumi

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<