天天看点

call_user_func_array

简介

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 + ;
    echo $args;
    return $args+;
}

$ret = call_user_func_array("foo",array());
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(,,,));
           

输出值为:

10
           

示例2

回调函数不仅仅只能是单纯的函数,也可以是类中的方法。

当回调函数是类中的方法时,call_user_func_arrayr的第1个参数也是数组,其中数组的第1个元素是类的实例,第2个元素是类中的方法名。

<?php

class A {
    public function foo($x){
        $c = ;
        for($i=; $i<=$x; $i++){
            echo "$i\n";
            $c += $i;
        }
        return $c;
    }
}

$a = new A;
echo call_user_func_array(array($a,"foo"),array());
           

输出为:

1
2
3
4
10
           

示例3

本类中没有这个方法时,调用其它类中的此方法。

<?php

class A {
    public function foo($x){
        $c = ;
        for($i=; $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();
           

类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