ecmall和discuz的源码中大量使用的函数之call_user_func_array详解

本文详细介绍了PHP函数call_user_func_array的用法,包括动态调用普通函数和类的静态方法示例,以及在ecmall和discuz源码中的应用。特别强调了当函数名称和参数不确定时,此函数的灵活性和便利性。
摘要由CSDN通过智能技术生成

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

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值