简介
php中的call_user_func_array用来调用回调函数,并且传递一个数组型的参数给这个回调函数,返回值是回调函数的返回值,如果出现错误则返回false。
mixed call_user_func_array ( callable $callback , array $param_arr )
参数$callback,指明要调用的回调函数名称;
参数$param_arr,指明要传递给回调函数的数组参数,注意这里传递的参数必须是数组,否则会报Warning级的错误。
示例1
<?php
function foo($args){
$args = $args + 10;
echo $args;
return $args+1;
}
$ret = call_user_func_array("foo",array(1));
echo $ret;
函数foo做为回调函数被call_user_func_array调用,并传入数组参数,函数中会输出一个值并返回一个值。输出结果如下:
1112
注意: call_user_func_array所接收的第2个参数必须是数组,否则会报错,但是如果回调函数只接受1个参数,那接受的这个参数并不是整个数组,而是数组的第1个元素,如果要接受数组的所有参数,应在回调函数的参数列表中设置与传参的数组元素个数相同的参数,如下示例:
<?php
function foo($a,$b,$c,$d){
$x = $a + $b + $c +$d;
return $x;
}
echo call_user_func_array("foo",array(1,2,3,4));
输出值为:
10
示例2
回调函数不仅仅只能是单纯的函数,也可以是类中的方法。
当回调函数是类中的方法时,call_user_func_arrayr的第1个参数也是数组,其中数组的第1个元素是类的实例,第2个元素是类中的方法名。
<?php
class A {
public function foo($x){
$c = 0;
for($i=1; $i<=$x; $i++){
echo "$i\n";
$c += $i;
}
return $c;
}
}
$a = new A;
echo call_user_func_array(array($a,"foo"),array(4));
输出为:
1
2
3
4
10
示例3
本类中没有这个方法时,调用其它类中的此方法。
<?php
class A {
public function foo($x){
$c = 0;
for($i=1; $i<=$x; $i++){
echo "$i\n";
$c += $i;
}
return $c;
}
}
class B {
private $a;
public function __construct(){
$this->a = new A;
}
public function __call($m,$p){
return call_user_func_array(array($this->a,$m),$p);
}
}
$b = new B;
echo $b->foo(4);
类B中并没有方法foo,所以调用的是类B中的__call方法,在__call函数中使用call_user_func_array来调用类A中的foo方法,传入的2个数组参数,第1个数组参数中的第1个元素是类A的实例,第2个参数是方法名;第2个数组中只有1个参数,即$b->foo(4)传递进来的参数4。
输出结果为:
1
2
3
4
10