首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP闭包函数及函数回调的实现方式

1. 匿名函数

在了解回调函数之前我们来了解一下什么是匿名函数?

顾名思义,匿名函数就是一个没有确定函数名的函数,PHP将匿名函数和闭包视作相同的概念,所以匿名函数在PHP中也叫作闭包函数

由于它没有名字,所以他只能被赋值给一个变量,不能单独存在,例如下方案例:

// 定义一个匿名函数

$a = function($v){

echo $v;

};

// 调用匿名函数

echo $a(1);

注意:匿名函数后面必须要有 ;

在PHP中匿名函数一般都是当作一个参数传给某个函数,例如:array_map(),array_filter(),usort()等一些特殊内置函数。具体使用方式如下方的自定义排序函数:

$arr = [2,1,3,5,4,6];

$callback = function ($a,$b){

if( $a == $b ) return 0;

return $a > $b ? 1 : -1;

};

$res = usort($arr,$callback);

var_dump($arr); //排序结果:[1,2,3,4,5,6]

对于上述自定义排序方法,我们还可以简化一下,把匿名函数直接当成参数传给 usort() 函数:

$arr = [2,1,3,5,4,6];

$res = usort($arr,function ($a,$b){

if( $a == $b ) return 0;

return $a > $b ? 1 : -1;

});

2. 回调函数

其实这种把自定义函数当成参数传给某个函数,再由函数内部进行回调的方式就叫做函数回调。只是匿名函数是一个特例,匿名函数与回调结合在PHP中成为闭包函数。

除了使用匿名函数之外,我也可以使用自定义函数,方式和上面的匿名函数相似:

$arr = [2,1,3,5,4,6];

function userSort($a,$b){

if( $a == $b ) return 0;

return $a > $b ? 1 : -1;

}

$res = usort($arr,'userSort');

注意:自定义函数当成参数传值时是一个字符串的形式,PHP会自动从当前脚本环境中寻找同名函数

3. 对象如何使用函数回调

上面的案例中我们都是回调函数,但是实际开发中我们都是基于面向对象的方式进行开发,那么如何把对象的某个方法当成函数回调进行传值呢?

在PHP中,我们只需要把回调函数以数组的形式传给主函数即可,例如:

class Sort{

function userSort($a,$b){

if( $a == $b ) return 0;

return $a > $b ? 1 : -1;

}

}

$arr = [2,1,3,5,4,6];

usort($arr,[(new Sort()),'userSort']);

var_dump($arr); // 执行结果:[1,2,3,4,5,6];

注意:把对象的某个方式当成回调函数时,参数一是当前对象,参数二才是实际回调的方法名

如果是在对象内部使用时,参数一直接使用 $this 代替即可。具体方式如下:

class Sort{

function userSort($a,$b){

if( $a == $b ) return 0;

return $a > $b ? 1 : -1;

}

function go($arr){

return usort($arr,[$this,'userSort']);

}

}

$arr = [2,1,3,5,4,6];

(new Sort())->go($arr);

var_dump($arr); //结果值:[1,2,3,4,5,6];

4. 自定义函数中如何实现函数回调

要实现函数回调功能,我们需要使用 call_user_func() 或者 call_user_func_array() 函数。

这两个函数的作用都是回调一个函数,不同的是回调函数时传参方式不同。

有点难理解,我们先来看看下方案例:

function sum1($a,$b,$callback){

call_user_func($callback,$a,$b);

call_user_func_array($callback,[$b,$a]);

return $a + $b;

}

sum1(1,2,function ($a,$b){

echo 'a的值:'.$a.PHP_EOL;

echo 'b的值:'.$b.PHP_EOL;

});

// 输出结果:

// a的值:1

// b的值:2

// a的值:2

// b的值:1

上面我们定义了一个计算加法的函数,但是在计算加法之前我们通过回调的形式打印两个变量的值。从使用上看,call_user_func() 函数传参是一个一个按顺序传值,而 call_user_func_array() 函数是把所有参数打包到数组中,数组中的值按顺序依次传值给回调函数

当然了,在使用上我们也可以把对象传过去,具体实现如下:

function sum1($a,$b,$callback){

call_user_func($callback,$a,$b);

call_user_func_array($callback,[$b,$a]);

return $a + $b;

}

class Test{

function callback($a,$b){

echo 'a的值:'.$a.PHP_EOL;

echo 'b的值:'.$b.PHP_EOL;

}

function go($a,$b){

// 对象内部使用

sum1($a,$b,[$this,'callback']);

}

}

// 对象外部使用

sum1(1,2,[new Test(),'callback']);

(new Test())->go(1,2);

现在,我们已经了解了它的实现原理,剩下的就是根据业务进行实际业务逻辑编辑实际代码。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OxEi4LxoY1XeTpYu2b2hszhg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券