## 回调函数
回调函数就是在主进程执行当中,突然跳转到预先设置好的函数中去执行的函数.
以下是一个非常简单的回调函数的例子:
```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'));
```
# 闭包函数
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 在php中,闭包函数一般就是匿名函数. 举例,有一个定时任务,每一秒执行一次,现在我们要开启一个服务,然后准备在30秒的时候关闭这个服务
```php
function tick($callback){
while (1) {//简单实现的定时器,每秒都去执行一次回调
call_user_func($callback);
sleep(1);
}
}
class Server
{
//模拟退出一个服务
public function exitServer()
{
return true;
}
}
$server = new Server();
$time = time();
tick(function ()use($server) {
$server->exitServer();
});
```
在这里面,使用匿名函数,use了函数外部的$server变量,才使得定时器能回调调用$server->exitServer();
### 匿名函数
匿名函数 通俗来讲,就是没有名字的函数,例如上面写的function(){},它通常作为闭包函数使用,使用方法如下:
```php
$fun = function($name){
printf("Hello %s\r\n",$name);
};
echo $fun('Tioncico');
function a($callback){
return $callback();
}
a(function (){
echo "EasySwoole\n";
return 1;
});
```
### use
PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。
```php
function a($callback){
return $callback();
}
$str1 = "hello,";
$str2 = "Tioncico,";
a(function ()use($str1,$str2){
echo $str1,$str2,"EasySwoole\n";
return 1;
});
```