在ecmall和discuz的源码中大量使用这个call_user_func_array,不得不认真看看它的使用方法了。简单来讲,就是调用一个函数或者一个类中的某个成员函数。手册上的原型是这样的:
mixed call_user_func_array ( callable $callback
, array $param_arr
)
第一个参数是函数名,第二个参数是参数数组,返回值是大杂烩。
还是写个demo看看了:
<?php function a($b, $c) { echo $b; echo $c; } call_user_func_array('a', array("111", "222")); //显示 111 222 ?>
<?php 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里面有一段:
/** * 显示错误警告 * * @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文件中定义的:
/** * 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了。
最后扯几句闲话,从初学者的角度来讲,PHP的强大之处在于它的灵活性,变量可以作为变量名,也可以作为函数名,直到PHP运行前,你都不知道调用的是那个类的那个方法,这是C++和Java无法想象的。也正因为这种灵活性,使得初学者举步维艰。因为在IDE中,你无法F3定位到函数的声明,够折磨人的。