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函数,当遍历数组满足条件时,则执行设定好的回调函数进行插入数据

## 回调函数的几种写法

### 函数字符串:

```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;

});

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值