首页 > 编程语言 >【PHP编程】PHP闭包函数及函数回调的实现方式

【PHP编程】PHP闭包函数及函数回调的实现方式

时间:2024-09-11 16:26:33浏览次数:1  
标签:闭包 arr 回调 return 函数 匿名 PHP

https://mp.weixin.qq.com/s/ji6hofCun7w7ErRvLuAiuA

原创 PHP星 编程经验共享 2023年10月19日 08:01 广东

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中,我们只需要把回调函数以数组的形式传给主函数即可,例如:

<?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 代替即可。具体方式如下:

<?php

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() 函数是把所有参数打包到数组中,数组中的值按顺序依次传值给回调函数

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

<?php

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://motui8.cn

标签:闭包,arr,回调,return,函数,匿名,PHP
From: https://www.cnblogs.com/o-O-oO/p/18405094

相关文章

  • 鸿蒙里面处理异步函数的方法
    1.使用then()方法是用于处理异步操作成功后的结果,并且可以链式调用以实现多个异步操作的顺序执行.then()处理初始Promise的结果,然后返回一个新的值,这个新值被传递给下一个.then(),以此类推错误处理:如果在.then()中的函数抛出错误,这个错误会被传递给下一个.then()的on......
  • 面试-JS基础知识-作用域和闭包、this
    函数作为返回值functioncreate(){consta=100returnfunction(){console.log(a)//a在这里是自由变量,向上寻找}}constfn=create()consta=200fn()//100函数作为参数functionprint(fn){consta=13fn()}consta=100functionfn(......
  • 数学建模之BP神经网络+函数代码解释
    神经网络原理~大样本数据-分类/预测~几百个是小样本神经网络——最易懂最清晰的一篇文章-CSDN博客误差大:Matlab中newff函数使用方法和搭建BP神经网络的方法_newff函数用法-CSDN博客net=newff(PR,[S1,S2],{'tansig','purelin'},'traingd')函数 newff:构建BP神经网络PR:训练......
  • OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述找到一个包围输入的二维点集的最小面积旋转矩形。该函数计算并返回指定点集的最小面积边界矩形(可能是旋转的)。开发者需要注意的是,当数据接近包含的Mat元素边界时,返回的Rotated......
  • OpenCV结构分析与形状描述符(20)计算一个包围给定点集的最小外接圆函数minEnclosingCirc
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述找到一个包围二维点集的最小面积的圆。该函数使用迭代算法来寻找一个二维点集的最小外接圆。这意味着函数将会通过反复逼近的过程来计算出能够包围所有给定点且面积最小的圆。mi......
  • JavaScript高级——函数
    1、函数的含义:①实现特定功能的n条语句的封装体。②只有函数是可以执行的,其他类型的数据不能执行。2、为什么要用函数?①提高代码复用②便于阅读交流3、如何定义函数?①函数声明②表达式4、如何调用(执行)函数?①test():直接调用②obj.test():通过对象调用③new.......
  • 如何使用初始化种子和迭代函数生成列表
    本篇阅读的代码实现使用一个初始化种子和迭代函数,通过嵌套函数对初始化种子进行迭代,最终生成一个列表。1、unfold函数接受迭代函数,并初始化种子,产生列表。对函数fn进行迭代化处理,必须始终返回包含两个元素的列表[value,nextSeed],或者返回False以终止构建器函数。2、函数的u......
  • [极客大挑战 2019]PHP
    1、页面提示有备份文件,使用kali中命令dirsearch扫描2、我的字典不够,扫不出,看了别人的扫出来是www.zip3、访问www.zip之后会下载压缩包,里面有三个php文件4、class.php<?phpinclude'flag.php';error_reporting(0);className{private$username='nonono';......
  • OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述测试轮廓的凸性。该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。cv::isContourConvex函数是OpenCV提供的一个用于判断轮廓是否......
  • OpenCV结构分析与形状描述符(16)判断两个凸多边形是否相交的函数intersectConvexConvex(
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述查找两个凸多边形的交集。intersectConvexConvex是一个在OpenCV中用于判断两个凸多边形是否相交的函数。此函数可以帮助我们确定两个二维凸多边形是否在平面上有重叠区域。函......