前言
从上一篇文章中我们了解到,回调函数是将一个函数作为参数传递到调用的函数中。如果在函数的格式说明中出现 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()的应用方式没有任何发生变化