PHP call_user_func_array函数
最近做一个功能,需要动态调用一批指定函数,这些函数还分属不同的类。需要调用的类和方法存在一个二维数组中:
$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()的参数不能为引用传递。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。