摘要:<?php/** * 教學(xué)內(nèi)容: 什么是閉包? * 1. 提到閉包,就不得不提匿名函數(shù),php官方手冊(cè)中,將閉包與匿名函數(shù)視為等同的 * 2. 閉包的三種使用場(chǎng)景: 函數(shù)內(nèi)部, 函數(shù)參數(shù), 函數(shù)返回值 *//** * 老師,昨晚講的回調(diào),覺得匿名函數(shù)真的很強(qiáng)大,有人說(shuō),匿名函數(shù)主要用在閉包中,那么閉包又是什么呢? * 閉包并不是ph
<?php
/**
* 教學(xué)內(nèi)容: 什么是閉包?
* 1. 提到閉包,就不得不提匿名函數(shù),php官方手冊(cè)中,將閉包與匿名函數(shù)視為等同的
* 2. 閉包的三種使用場(chǎng)景: 函數(shù)內(nèi)部, 函數(shù)參數(shù), 函數(shù)返回值
*/
/**
* 老師,昨晚講的回調(diào),覺得匿名函數(shù)真的很強(qiáng)大,有人說(shuō),匿名函數(shù)主要用在閉包中,那么閉包又是什么呢?
* 閉包并不是php的專利,很多編程語(yǔ)言都有的,例如,javascript,當(dāng)然,php中的閉包,還是很有特色的
*/
/**
* @param $name
* @return string
*/
$demo1 = function ($name) {
return $name . '最愛的人是: 趙敏';
};
//調(diào)用匿名函數(shù)
echo $demo1('張無(wú)忌'), '<hr>';
//匿名函數(shù)也有自己的作用域,如果要在函數(shù)作用域中使用外部變量,除了傳參,還可以這樣
$belle = '周芷若';
//$demo2 = function ($name) {
$demo2 = function ($name) use ($belle) {
// return $name . '最愛的人是趙敏';
return $name . '最愛的人是: ' . $belle;
};
//調(diào)用匿名函數(shù)
echo $demo2('張無(wú)忌'), '<hr>';
//匿名函數(shù)可以使用use 關(guān)鍵字,訪問(wèn)參數(shù)列表之外的數(shù)據(jù),而且這個(gè)數(shù)組可以來(lái)自匿名函數(shù)的外部,這個(gè)可太有意思了
//它可以實(shí)現(xiàn)非常多的實(shí)用功能,極大的增強(qiáng)了函數(shù)的功能
//現(xiàn)在,咱們來(lái)詳細(xì)說(shuō)說(shuō)閉包的問(wèn)題,理解了匿名函數(shù),以及匿名函數(shù)中的use關(guān)鍵字的使用,閉包就非常簡(jiǎn)單了
//首先,我們先給閉包下一個(gè)簡(jiǎn)單的定義: 將匿名函數(shù)當(dāng)作一個(gè)普通變量,在另一個(gè)函數(shù)中調(diào)用它,就會(huì)形成一個(gè)閉包,這時(shí),匿名函數(shù)的功能,
//就是生成一個(gè)閉包,所以,現(xiàn)在把匿名函數(shù),直接稱為: 閉包函數(shù), 也是沒問(wèn)題的。
//變量在函數(shù)中有三個(gè)作用:1. 當(dāng)作局部變量 2.當(dāng)作參數(shù),其實(shí)還是局部變量 3. 當(dāng)作返回值,基本質(zhì)還是一個(gè)局部變量
//所以閉包也有三種使用場(chǎng)景:
//1.閉包函數(shù)當(dāng)作局部變量使用
$func1 = function () {
$name = '無(wú)忌哥哥';
//定義一個(gè)內(nèi)部的匿名函數(shù)
$test = function () use ($name) {
return $name . ',我另一個(gè)函數(shù)包住了,快來(lái)救我';
};
//調(diào)用,必須要調(diào)用一次,才能形成閉包
return $test();
};
echo $func1(), '<hr>';
//2.閉包函數(shù)當(dāng)作函數(shù)參數(shù)使用
$name = '無(wú)忌哥哥';
$test = function () use ($name) {
return $name . ',我又被當(dāng)作參數(shù)啦,你還要我嗎?';
};
$func2 = function (callable $callback) {
//執(zhí)行匿名回調(diào)并返回
return $callback();
};
//用匿名函數(shù)做為參數(shù)調(diào)用
echo $func2($test), '<hr>';
//3.閉包函數(shù)當(dāng)用函數(shù)返回值使用
$func3 = function () {
$name = '無(wú)忌哥哥';
$test = function () use ($name) {
return $name . ',我又被當(dāng)作參數(shù)啦,真倒霉~~';
};
return $test;
};
//你可能見到最多的是這種簡(jiǎn)寫形式
$func3 = function () {
$name = '無(wú)忌哥哥';
return function () use ($name) {
return $name . ',我又被當(dāng)作返回值,掃地出門啦,你還要我嗎?';
};
};
// $func3() 的返回值是一個(gè)函數(shù),所以再加一對(duì)圓括號(hào),才可以執(zhí)行
echo $func3()();
/**
* 現(xiàn)在明白了,原來(lái)閉包可以當(dāng)作一個(gè)普通函數(shù)使用,也可以當(dāng)作函數(shù)參數(shù)使用,甚至可以當(dāng)作函數(shù)的返回值
* 是的,閉包還有二個(gè)生效條件:第一,必須是定義一個(gè)匿名函數(shù), 第二,必須要執(zhí)行一次來(lái)生成閉包函數(shù)
*/
//以上就是最經(jīng)典的三種閉包使用場(chǎng)景,大家記住二點(diǎn)即可:
//第一,必須是定義一個(gè)匿名函數(shù), 第二,必須要執(zhí)行一次來(lái)生成閉包函數(shù)
批改老師:天蓬老師批改時(shí)間:2019-08-15 10:46:13
老師總結(jié):<?php
/**
* 教學(xué)內(nèi)容: 什么是閉包?
* 1. 提到閉包,就不得不提匿名函數(shù),php官方手冊(cè)中,將閉包與匿名函數(shù)視為等同的
* 2. 閉包的三種使用場(chǎng)景: 函數(shù)內(nèi)部, 函數(shù)參數(shù), 函數(shù)返回值
*/
/**
* 老師,昨晚講的回調(diào),覺得匿名函數(shù)真的很強(qiáng)大,有人說(shuō),匿名函數(shù)主要用在閉包中,那么閉包又是什么呢?
* 閉包并不是php的專利,很多編程語(yǔ)言都