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