写点什么

【web 开发基础】PHP 自定义回调函数之 call_user_func_array() (36)

作者:迷彩
  • 2022-11-27
    广东
  • 本文字数:1308 字

    阅读完需:约 4 分钟

前言

从上一篇文章中我们了解到,回调函数是将一个函数作为参数传递到调用的函数中。如果在函数的格式说明中出现 callback 类型的参数,则该函数就是回调函数。虽然可以使用变量函数去声明自己的回调函数,不过我们通常大多还是会通过借助 call_user_func_array() 函数去实现。通过借助 call_user_func_array()来实现函数的回调,使得回调的方式更加灵活,使用更加方便。call_user_func_array()函数时 PHP 的一个内置函数,call_user_func_array()本身就是一个回调函数,使用 call_user_func_array()来实现函数的回调的语法格式如下:

mixed call_user_func_array(callback function, array param_array);
复制代码

从上面的语法格式可以看出,call_user_func_array()函数有两个参数,第一个参数因为使用伪类型 callback, 所以这个参数需要传递的是一个字符串,表示要调用的函数名;第二个参数则是一个数组类型的参数,表示参数列表,按照顺序依次会对应地传递给要调用的函数。

编程实践


下面我们通过实例来体验一下 call_user_func_array()函数的用法:声明一个 fun()函数通过回调的方式去调用该函数

<?php function fun($msg1, $msg2){
echo "$msg1 = ".$msg1;
echo "\n";
echo "$msg2 = ".$msg2;
}
//通过系统函数call_user_func_array()调用函数fun(),第一个参数为函数的fun的名称字符串
call_user_func_array("fun",array("hello","world"));
?>
复制代码

执行结果如下图所示:

上面的例子中第 14 行代码,通过系统函数 call_user_func_array() 调用自己定义的函数 fun(),将函数 fun() 的名称字符串传递给了 call_user_func_array() 函数中的第一个参数,第二个参数则需要的是一个数组,数组中的元素个数必须和 fun()函数的参数列表的个数相同。因为这个数组参数中的每个元素的值都会通过 call_user_func_array() 函数 ,按照顺序依次传递给回调到的函数 fun()参数列表对应的参数中。所以我们可以将前面通过变量函数实现的自定义回调函数,改成借助 call_user_func_array() 函数的方式进行实现。

改进代码如下:

<?php
//声明回调函数filter, 在0-30的整数中通过自定义条件过滤不要的数字
function filter($fun){ for($i=0; $i<=30; $i++){ //使用系统函数call_user_func_array(),调用和变量$fun值相同的函数 if(call_user_func_array($fun,array($i))) { continue; } echo $i . "\n"; } }
//声明一个函数one,如果参数是3的倍数就返回ture,否则返回false
function one($num){ return $num%3 == 0; }
//声明一个函数two,如果参数是一个回文数返回ture,否则返回false
function two($num){ return $num == strrev($num); } filter("one"); //打印出30以内非3的倍数,参数one是函数one()的名称字符串,是一个回调
echo "----------完美的分割线-----------\n";
filter("two"); //打印出30以内非回文数,参数two是函数two()的名称字符串,是一个回调
?>
复制代码

执行结果如下:

从执行结果可以看出,自定义的函数 filter()内部,将原来的变量函数位置修改写成借助 call_user_func_array() 函数的调用方式进行回调自定义函数,而函数 filter()的应用方式没有任何发生变化

发布于: 刚刚阅读数: 4
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020-06-18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
【web 开发基础】PHP自定义回调函数之call_user_func_array() (36)_回调函数_迷彩_InfoQ写作社区