[TOC]
# 回調函數
******
回調函數就是在主進程執行當中,突然跳轉到預先設置好的函數中去執行的函數。
```php
以下是來自知乎作者常溪玲的解說:
你到一個商店買東西,剛好你要的東西沒有貨,于是你在店員那里留下了電話,過了幾天店里有貨了,
店員就打了你的電話,然后你接到電話后就到店里去取了貨。在這個例子里,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店里后來有貨了叫做觸發了回調關聯的事件,店員給你打電話叫做調用回調函數,你到店里去取貨叫做響應回調事件。
```
以下是一個非常簡單的回調函數的例子:
```php
<?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 函數,當遍歷數組滿足條件時,則執行設定好的回調函數進行插入數據。
<br />
## 回調函數的幾種寫法
### 函數字符串
```php
<?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');
```
<br />
### 匿名函數
```php
<?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):bool {
echo "插入數據{$i}\n"; // 模擬插入數據庫插入
return true;
});
```
<br />
### 類靜態方法
```php
<?php
class A
{
public static 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, array('A', 'insert'));
action($arr, 'A::insert');
```
<br />
### 類方法
```php
<?php
class A
{
public 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);
}
}
}
$a = new A();
action($arr, array($a, 'insert'));
```
- 引言
- Introduction
- 運行模式
- php-fpm
- php-cli
- 基礎介紹
- 網絡協議
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 會話管理
- cookie
- session
- api/token
- linux基礎
- lnmp安裝
- 命令
- 進程管理
- 擴展安裝
- 端口監控
- 防火墻說明
- php7.0
- 部分新特性
- php回調/閉包
- 回調事件
- 閉包/匿名函數
- php多進程
- 多進程開啟
- 進程通信
- 進程信號
- 僵尸進程
- 孤兒進程
- 守護進程
- 同步/異步
- 阻塞/非阻塞
- 協程
- Swoole
- 初始Swoole
- 運行機制
- 生命周期
- composer使用
- EasySwoole
- 設計理念
- 組件說明
- 運行過程
- demo
- 提問的藝術