摘要:已經(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
摘要:服務(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...
摘要:也就是閑時(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ò)展編寫...
摘要:服務(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 ...
摘要:安裝代碼加載并實(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...
摘要:實(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)依然存在。 理論上...
閱讀 1985·2021-11-22 14:45
閱讀 2593·2021-10-12 10:11
閱讀 768·2021-09-22 10:02
閱讀 1197·2019-08-30 15:55
閱讀 1142·2019-08-30 15:54
閱讀 3247·2019-08-30 15:54
閱讀 1181·2019-08-29 17:16
閱讀 3080·2019-08-28 17:55