回調(diào)函數(shù)
回調(diào)函數(shù)就是在主進(jìn)程執(zhí)行當(dāng)中,突然跳轉(zhuǎn)到預(yù)先設(shè)置好的函數(shù)中去執(zhí)行的函數(shù).
以下是自知乎作者常溪玲的解說(shuō):
你到一個(gè)商店買(mǎi)東西,剛好你要的東西沒(méi)有貨,于是你在店員那里留下了你的電話,過(guò)了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨。在這個(gè)例子里,你的電話號(hào)碼就叫回調(diào)函數(shù),你把電話留給店員就叫登記回調(diào)函數(shù),店里后來(lái)有貨了叫做觸發(fā)了回調(diào)關(guān)聯(lián)的事件,店員給你打電話叫做調(diào)用回調(diào)函數(shù),你到店里去取貨叫做響應(yīng)回調(diào)事件。
以下是一個(gè)非常簡(jiǎn)單的回調(diào)函數(shù)的例子:
<?php
//登記回調(diào)函數(shù)
function insert(int $i):bool {
echo "插入數(shù)據(jù){$i}\n";//模擬數(shù)據(jù)庫(kù)插入//響應(yīng)回調(diào)事件
return true;
}
$arr = range(0,1000);//模擬生成1001條數(shù)據(jù)
function action(array $arr, callable $function)
{
foreach ($arr as $value) {
if ($value % 10 == 0) {//當(dāng)滿足條件時(shí),去執(zhí)行回調(diào)函數(shù)處理//觸發(fā)回調(diào)
call_user_func($function, $value);//調(diào)用回調(diào)事件
}
}
}
action($arr,'insert');
在這個(gè)例子中,首先定義了一個(gè)插入數(shù)據(jù)的函數(shù),定義了一個(gè)1001條數(shù)據(jù)的數(shù)組 然后調(diào)用了action函數(shù),當(dāng)遍歷數(shù)組滿足條件時(shí),則執(zhí)行設(shè)定好的回調(diào)函數(shù)進(jìn)行插入數(shù)據(jù)
回調(diào)函數(shù)的幾種寫(xiě)法
函數(shù)字符串:
<?php
function insert(int $i):bool {
echo "插入數(shù)據(jù){$i}\n";//模擬數(shù)據(jù)庫(kù)插入
return true;
}
$arr = range(0,1000);//模擬生成1001條數(shù)據(jù)
function action(array $arr, callable $function)
{
foreach ($arr as $value) {
if ($value % 10 == 0) {//當(dāng)滿足條件時(shí),去執(zhí)行回調(diào)函數(shù)處理
call_user_func($function, $value);
}
}
}
action($arr,'insert');
匿名函數(shù)
<?php
$arr = range(0,1000);//模擬生成1001條數(shù)據(jù)
function action(array $arr, callable $function)
{
foreach ($arr as $value) {
if ($value % 10 == 0) {//當(dāng)滿足條件時(shí),去執(zhí)行回調(diào)函數(shù)處理
call_user_func($function, $value);
}
}
}
action($arr,function($i){
echo "插入數(shù)據(jù){$i}\n";//模擬數(shù)據(jù)庫(kù)插入
return true;
});
類(lèi)靜態(tài)方法
<?php
$arr = range(0, 1000);//模擬生成1001條數(shù)據(jù)
function action(array $arr, callable $function)
{
foreach ($arr as $value) {
if ($value % 10 == 0) {//當(dāng)滿足條件時(shí),去執(zhí)行回調(diào)函數(shù)處理
call_user_func($function, $value);
}
}
}
class A{
static function insert(int $i):bool {
echo "插入數(shù)據(jù){$i}\n";//模擬數(shù)據(jù)庫(kù)插入
return true;
}
}
action($arr,'A::insert');
action($arr,array('A','insert'));
類(lèi)方法
<?php
$arr = range(0, 1000);//模擬生成1001條數(shù)據(jù)
function action(array $arr, callable $function)
{
foreach ($arr as $value) {
if ($value % 10 == 0) {//當(dāng)滿足條件時(shí),去執(zhí)行回調(diào)函數(shù)處理
call_user_func($function, $value);
}
}
}
class A{
public function insert(int $i):bool {
echo "插入數(shù)據(jù){$i}\n";//模擬數(shù)據(jù)庫(kù)插入
return true;
}
}
$a = new A();
action($arr,array($a,'insert'));