在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这样的函数。