摘要:在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í)例化,提高效率。
網(wǎng)友評(píng)論:
老師講解的不錯(cuò)
2019-04-18 16:17:27 回復(fù)