溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

從匿名函數(shù)到PHP設(shè)計(jì)模式之容器模式的案例

發(fā)布時(shí)間:2020-10-29 14:14:09 來源:億速云 閱讀:153 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了從匿名函數(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

php
AI