99久久国产露脸精品麻豆,欧美日韩精品小说,亚洲免费在线美女视频,国产三级中文字幕,91极品国产情侣高潮对白,国产亚洲一区二区三区不卡片,欧美jizz精品欧美性,久久国产精品久久国产片

php閉包函數(shù)(二)

袁志蒙 4559次瀏覽

摘要:在PHP中,可以理解閉包是由匿名函數(shù)構(gòu)成的一種“結(jié)構(gòu)”。就像string,int等,可以把閉包函數(shù)作為變量的值來使用。PHP會(huì)自動(dòng)把此種表達(dá)式轉(zhuǎn)換成內(nèi)置類 Closure 的對(duì)象實(shí)例。在上文中我有說道...

在PHP中,可以理解閉包是由匿名函數(shù)構(gòu)成的一種“結(jié)構(gòu)”。

就像string,int等,可以把閉包函數(shù)作為變量的值來使用。PHP會(huì)自動(dòng)把此種表達(dá)式轉(zhuǎn)換成內(nèi)置類 Closure 的對(duì)象實(shí)例。


1.在上文中我有說道匿名函數(shù)(閉包函數(shù))調(diào)用方式是 變量名() 其實(shí)就是調(diào)用了Closure類中的__invoke()方法,證明一下:

$var = function ($name) {
    return 'Hello ' . $name . '<br>';
};

echo $var->__invoke("yzmcms");
echo $var("yzmcms");
// 運(yùn)行結(jié)果:
// Hello yzmcms
// Hello yzmcms

2.php閉包使用例子:

class test{
    private $_factory;
    public function set($id, $value){
        $this->_factory[$id] = $value;
    }
    
    public function get($id){
        $value = $this->_factory[$id];
        return $value();	//如果不加括號(hào),僅僅返回的是閉包類的一個(gè)對(duì)象,并不是user實(shí)例
    }
}
class user{
    private $_username;
    function __construct($username = '') {
		echo '我被實(shí)例化了<br>';
        $this->_username = $username;
    }
    function get_username(){
        return $this->_username;
    }
}


$test = new test();
$test->set('zhangsan', function(){
    return new user('張三');
});
$test->set('lisi', function(){
   return new user('李四'); 
});
echo $test->get('zhangsan')->get_username();	
echo '<br>';
echo $test->get('lisi')->get_username();

// 運(yùn)行結(jié)果:
// 我被實(shí)例化了
// 張三
// 我被實(shí)例化了
// 李四

代碼test類中有一個(gè)工廠($_factory)用來保存對(duì)象實(shí)例,然后通過set()方法注冊服務(wù),通過get()方法獲取服務(wù)。

我們看到$test->set()的時(shí)候,使用了匿名函數(shù),我們預(yù)先注冊了zhangsan和lisi兩個(gè)服務(wù),這兩個(gè)服務(wù)都是user類的實(shí)例,在$test->set的時(shí)候?qū)嶋H上并沒有實(shí)例化,而是在$test->get()的時(shí)候才執(zhí)行了匿名函數(shù)并將對(duì)象返回,這就實(shí)現(xiàn)了按需實(shí)例化,不用則不實(shí)例化,提高效率。

隨機(jī)內(nèi)容

表情

共1條評(píng)論
  • 網(wǎng)友評(píng)論:

    老師講解的不錯(cuò)

    2019-04-18 16:17:27 回復(fù)

    點(diǎn)擊加載