您好,登錄后才能下訂單哦!
這篇文章主要介紹了從匿名函數(shù)到PHP設(shè)計(jì)模式之容器模式的案例,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
匿名函數(shù)(閉包函數(shù))
匿名函數(shù),也叫閉包函數(shù),它允許臨時(shí)創(chuàng)建一個(gè)沒有指定名稱的函數(shù),常用作回調(diào)函數(shù)參數(shù)的值,也可以作為變量的值來使用。具體的使用見以下示例代碼:
/* 示例一:聲明一個(gè)簡(jiǎn)單匿名函數(shù),并賦值給一個(gè)變量,通過變量名調(diào)用這個(gè)匿名函數(shù) */ $anonFunc = function($param){ echo $param; }; $anonFunc('這里是一個(gè)匿名函數(shù)'); // 通過變量名調(diào)用匿名函數(shù),和普通函數(shù)沒什么區(qū)別 /* 示例二:通過在函數(shù)內(nèi)部使用匿名函數(shù)動(dòng)態(tài)創(chuàng)建函數(shù) */ function operate($operator){ if($operator == '+'){ return function($a, $b){ return $a + $b; } } if($operator == '-'){ return function($a, $b){ return $a - $b; } } } $add = operate('+'); echo $add(4, 3); // 7 $sub = operate('-'); echo $sub(4, 3); // 1 /* 示例三:匿名函數(shù)作為回調(diào)函數(shù)參數(shù)傳入 */ function callback($callback){ $callback(); } function callback(){ // 閉包測(cè)試函數(shù) echo '這里是閉包測(cè)試函數(shù)體'; }
以上代碼中的三個(gè)示例中,匿名函數(shù)都沒有進(jìn)行傳參,我們知道在 JavaScript 中匿名函數(shù)用得很頻繁,而且父函數(shù)中的參數(shù)變量在子函數(shù)中可以直接使用,但是 PHP 語(yǔ)言不允許這樣做,需要用到 use ($var) 關(guān)鍵字(注意代碼中的使用方式)實(shí)現(xiàn)同樣的目的。針對(duì)上面代碼中的示例三做如下修改:
/* 示例三修改:匿名函數(shù)作為參數(shù)傳入,并且攜帶參數(shù) */ function callback($callback) use ($content){ $callback($content); } $content = '這里是閉包函數(shù)的輸出內(nèi)容'; function callback($content){ // 閉包函數(shù) echo $content; }
以上代碼中的示例二,也可以通過 use 關(guān)鍵字實(shí)現(xiàn)匿名函數(shù)對(duì)父函數(shù)外層變量的引用。這些示例代碼中匿名函數(shù)和閉包特性的運(yùn)用,只是為了理解概念,并沒有多大的實(shí)戰(zhàn)意義,閉包的用途有很多,常見的是用在 PHP 框架中容器模式的依賴注入(DI)中。
PHP 面向?qū)ο笾萜髂J?/strong>
顧名思義,容器就是用來存放東西的,其實(shí)就是聲明一個(gè)類,專門用來存取對(duì)象實(shí)例,既然如此,那么容器里至少要有兩個(gè)核心方法,以實(shí)現(xiàn)綁定依賴到容器和從容器獲取依賴。容器可以說是一個(gè)依賴管理工具,有時(shí)候也叫做服務(wù)容器。
/* 聲明一個(gè)簡(jiǎn)單的容器類 */ class Container{ private $_diList = array(); // 用于存放依賴 /* 核心方法之一,用于綁定服務(wù) * @param string $className 類名稱 * @param mixed $concrete 依賴在容器中的存儲(chǔ)方式,可以是類名字符串,數(shù)組,一個(gè)實(shí)例化對(duì)象,或者是一個(gè)匿名函數(shù) */ puclic function set($className, $concrete){ $this->_diList[$className] = $concrete; } /* * 核心方法之二,用于獲取服務(wù)對(duì)象 * @param string $className 將要獲取的依賴的名稱 * @return object 返回一個(gè)依賴的實(shí)例化對(duì)象 */ public function get($className){ if(isset($this->_diList[$className])){ return $this->diList[$className]; } return null; } }
以上代碼就是一個(gè)簡(jiǎn)單的容器模式,其中的 set 方法用于注冊(cè)依賴,get 方法用于獲取依賴。容器存儲(chǔ)依賴的方式有很多,以下示例代碼以匿名函數(shù)的方式作為說明。
/* 數(shù)據(jù)庫(kù)連接類 */ class Connection{ public function __construct($dbParams){ // connect the database... } public someDbTask(){ // code... } } /* 會(huì)話控制類 */ class Session{ public function openSession(){ session_start(); } // code... } $container->set('session', function(){ return new Session(); }); $container = new Container(); // 使用容器注冊(cè)數(shù)據(jù)庫(kù)連接服務(wù) $container->set('db', function(){ return new Connetion(array( "host" => "localhost", "username" => "root", "password" => "root", "dbname" => "dbname" )); }); // 使用容器注冊(cè)會(huì)話控制服務(wù) $container->set('session', function(){ return new Session(); }); // 獲取之前注冊(cè)到容器中的服務(wù),并進(jìn)行業(yè)務(wù)的處理 $container->get('db')->someDbTask(); $container->get('session')->openSession();
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享從匿名函數(shù)到PHP設(shè)計(jì)模式之容器模式的案例內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。