前言

从上一篇文章中我们了解到,回调函数是将一个函数作为参数传递到调用的函数中。如果在函数的格式说明中出现 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"));

?>

执行结果如下图所示:

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

上面的例子中第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()的名称字符串,是一个回调

?>

执行结果如下:

【web 开发基础】PHP自定义回调函数之call_user_func_array() _字符串_02

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