最近做一个功能,需要动态调用一批指定函数,这些函数还分属不同的类。需要调用的类和方法存在一个二维数组中:

$needDo = array(

{

'className' => 'xxx',

'methodName' => 'xxx'

},

……

);

而且各个method 的参数都为空,根据这个情况于是我想到了call_user_func_array 这个函数。

这个函数可以动态的调用某个类中的某个方法,并且可以传递任意个参数,对于当前这个场景可以说是十分的适合了。

下面具体说说这个函数的用法。

给出的定义是这样的:

call_user_func_array : 调用回调函数,并把一个数组参数作为回调函数的参数。

说明:mixed call_user_func_array ( callable $callback , array $param_arr )

把第一个参数作为回调函数(callback)调用,把参数数组做(param_arr)为回调函数的的参数传入。

返回回调函数的结果。如果出错的话就返回FALSE

比如调用的方法不存在 或者类不存在都会返回 FALSE

使用方式主要有以下两种:

一、类内函数的调用

首先呢,这个函数可以支持回调类内的方法,这个时候该函数的第一个参数就不必是数组了,直接把要调用的类内方法的签名放到第一个参数的位置就可以,第二个参数根据实际情况将之顺序放入到数组中即可。

如:

class a { public function b ($c) {return $c;} call_user_func_array('b', array($e))}

二、调用其他类的方法

这个情况会比较复杂,这个时候呢 该函数的第一个参数的类名可以是一个对象,也可以是一个未经初始化的类。方法呢可以支持静态方法和非静态方法。

1、无需实例化调用类的静态方法

call_user_func_array(array('className', 'staticMethodName'), array('param1'));

2、不实例化调用类的非静态方法

call_user_func_array(array('className', 'methodName'), array('param1'));

这种方式使用需要谨慎一点,因为这样使用的话类是没有实例化的,如果调用的方法中有$this语句,会报错,因为 $this 指向的是当前类的一个实例,没有实例化,$this 就是一个空指针,空指针引用是会fatal 的,所以这个方法的使用需要当心一点。

3、调用实例化后的类的非静态方法

$obj = new ClassName();

call_user_func_array(array($obj, 'methodName'), array('param1'));

该函数的第一个参数如果是对象的话,支持传递对象的指针。

call_user_func_array(array(&$obj, 'methodName'), array('param1'));

拓展:

与该函数特别相似的一个函数是 call_user_func。

该方法的定义如下:

call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed

第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

参数 callback

将被调用的回调函数(callable)。

参数 parameter

0个或以上的参数,被传入回调函数。

注意:

请注意,传入call_user_func()的参数不能为引用传递。