zoukankan      html  css  js  c++  java
  • PHP中的call_user_func()与call_user_func_array()简单理解

    原文地址:http://small.aiweimeng.top/index.php/archives/52.html

    call_user_func:把一个参数作为回调函数调用

    用法说明:

    call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
    

      

    参数说明:

    第一个参数$callback作为回调函数,其它参数都是回调函数的参数。

    $parameter:传入回调$callback函数的参数,这里的参数注意不能引用传递。

    下面简单例子分别说明了在不同情况下使用call_user_func:

    //先引用,后执行
    function _call($call){
        echo $call++.'<br/>';
        echo $call++.'<br/>';
        return $call;
    }
    $rs = call_user_func('_call',1);
    var_dump($rs);
    
    //结果
    //1
    //2
    //int(3)
    

      

    先执行,后引用

    $arg = 1;
    call_user_func(function ($call){
        echo ++$call.'<br/>';
        echo ++$call.'<br/>';
    },$arg);
    
    //结果为2,3
    

      

    回调函数不传值,通过func_get_arg和func_get_args获取参数

    $argOne = 1;
    $argTwo = 2;
    call_user_func(function (){
        //获取第几个参数
        $arg = func_get_arg(0);
        var_dump($arg);
        echo '<br/>';
        //获取所有的参数,并以数组的形式返回
        $args = func_get_args();
        var_dump($args);
        //获取参数个数
        $argNum = func_num_args();
        echo "<br/>";
        var_dump($argNum);
    },$argOne,$argTwo);
    
    //结果为
    int(1) 
    array(2) { [0]=> int(1) [1]=> int(2) } 
    int(2)
    

      

    调用类方法:

    调用类中的静态方法有两种形式,而调用public方法第一个参数只能为数组

    class Func{
    
        static public function _One(){
            $str = "THE CLASS NAME IS".__CLASS__." AND CLASS STATIC METHOD IS ".__METHOD__;
            $argNum = func_num_args();
            if($argNum){
                $arg = func_get_arg(0);
                return $str.' and argument is '.$arg;
            }else{
                return $str;
            }
        }
    
    
        public function _Two($num){
            return $num ? $num + 1 : $num;
        }
    
    }
    
    echo "<br/>";
    //调用类的静态方法
    var_dump(call_user_func('Func::_One','one'));
    echo '<br/>';
    var_dump(call_user_func(['Func','_One']));
    
    $num = 4;
    $o = new Func;
    //调用类普通方法
    $return = call_user_func(array($o,'_Two'),$num);
    echo '<br/>';
    var_dump($return);
    
    结果:
    string(79) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One and argument is one" 
    string(59) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One" 
    int(5)
    

      

    调用有命名空间的类时call_user_func的用法与上面的同理

    //调用静态方法
    call_user_func(array(__NAMESPACE__.'StaticDemo','_One'),100);
    call_user_func('AppStaticDemo::_One',200);
    //调用public方法
    call_user_func(array($obj,'_Two'),2,3,4);
    

      

    最后:
    和call_user_func函数类似的还有call_user_func_array,call_user_func_array的作用和call_user_func的作用一样,
    不同的是call_user_func用回调函数处理字符,而call_user_func_array用回调处理数组,也就是说call_user_func_array的参数二只能为数组。

  • 相关阅读:
    python requests 模拟登陆网站,抓取数据
    python 爬取淘宝的模特照片
    vim 和grep 正则表达式相似和区别
    python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
    python 正则表达式
    12个球,其中一个和其他的重量不一样,有一个天平,最多几次找出这个球
    25匹马中选出跑得最快的3匹,每次只有5匹马同时跑,最少要比赛几次
    1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药
    146 LRU Cache
    用两个int值实现读写锁
  • 原文地址:https://www.cnblogs.com/smallKilts/p/10535756.html
Copyright © 2011-2022 走看看