在ecmall和discuz的源码中大量使用这个call_user_func_array,不得不认真看看它的使用方法了。简单来讲,就是调用一个函数或者一个类中的某个成员函数。手册上的原型是这样的:
|
1
|
mixed call_user_func_array ( callable $callback , array $param_arr )
|
第一个参数是函数名,第二个参数是参数数组,返回值是大杂烩。
写俩个demo来看看就知道了
动态调用普通函数时,在这种情况下也是很有作用:
|
1
|
<span style="font-size: 16px;"> function a($b, $c){<br> echo $b;echo $c;<br> }<br> call_user_func_array('a', array("111", "222"));<br> //显示 111 222<br></span>
|
当动态调用类的静态方法时它还是有作用的:
|
1
2
3
4
5
6
7
|
Class ClassA{
function bc($b, $c) {
$bc = $b + $c;echo $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//显示 333
|
在ecmall的includes\ecapp.base.php里面有一段:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* 显示错误警告
*
*
@author Garbin
* @param none
* @return void
*/
function show_warning() {
$args = func_get_args();
call_user_func_array('show_warning', $args);
}
|
实际上这个show_message()函数最终是eccore/controller/messages.base.php文件中定义的:
|
1
2
3
4
5
6
7
8
9
|
/**
* send a system warning message
*
* @param string $msg
*/
function show_warning ($msg){
$a = _trigger_message(func_get_args());
_message(serialize($a), E_USER_WARNING);
}
|
这里的func_get_args将变量数组取出来,也就是得到上面的$args了。
当然你会觉得,直接调用不就得了。何必这么麻烦,写这么复杂。所以我举个例子,就知道这个函数的好处了。
函数的变量的个数不确定的时候,调用这个函数是非常的好用的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function playVideo($video){
echo '哥在用用Video看电影-',$video;
}
function playAudio($artist,$music){
echo '哥在用Mp3听',$artist,'的歌-',$music;
}
function play(){
$args = func_get_args();
$functionName = array_shift($args);
call_user_func_array( 'play'.$functionName, $args );
}
play('Video','《功夫》'); play('Audio', 'Jay','《简单爱》');
|
使用场景:
1、你要调用的函数名是未知的
2、要调用函数的参数类型及个数也是未知的
因为未知,所以得用call_user_func_array这样的函数。