放牧代码和思想
专注自然语言处理、机器学习算法
    愛しさ 優しさ すべて投げ出してもいい

call_user_func_array用法

在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定位到函数的声明,够折磨人的。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » call_user_func_array用法

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的作品

HanLP自然语言处理包《自然语言处理入门》