在ecmall和discuz的源码中大量使用这个call_user_func_array,不得不认真看看它的使用方法了。简单来讲,就是调用一个函数或者一个类中的某个成员函数。手册上的原型是这样的:
call_user_func_array($callback,array $param_arr)
第一个参数是函数名,第二个参数是参数数组,返回值是大杂烩。
还是写个demo看看了:
function a($b, $c)
{
echo $b;
echo $c;
}
call_user_func_array('a', array("111", "222"));
//显示 111 222
?>
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定位到函数的声明,够折磨人的。