美文网首页PHP经验分享
自定义函数call_user_func和call_user_fu

自定义函数call_user_func和call_user_fu

作者: PHP__架构师之路 | 来源:发表于2019-03-27 18:54 被阅读1次

    看UCenter的时候有一个函数call_user_func,百思不得其解,因为我以为是自己定义的函数,结果到处都找不到,后来百度了一下才知道call_user_func是内置函数

    call_user_func函数类似于一种特别的调用函数的方法,使用方法如下:

    复制代码 代码如下:

    function a($b,$c) 
    { 
    echo $b; 
    echo $c; 
    } 
    call_user_func('a', "111","222"); 
    call_user_func('a', "333","444"); 
    //显示 111 222 333 444 
    

    调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:

    复制代码 代码如下:

    class a { 
    function b($c) 
    { 
    echo $c; 
    } 
    } 
    call_user_func(array("a", "b"),"111"); 
    //显示 111 
    

    call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:

    复制代码 代码如下:

    function a($b, $c) 
    { 
    echo $b; 
    echo $c; 
    } 
    call_user_func_array('a', array("111", "222")); 
    //显示 111 222 
    

    call_user_func_array函数也可以调用类内部的方法的

    复制代码 代码如下:

    Class ClassA 
    { 
    function bc($b, $c) { 
    $bc = $b + $c; 
    echo $bc; 
    } 
    } 
    call_user_func_array(array('ClassA','bc'), array("111", "222")); 
    //显示 333 
    

    call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:

    复制代码 代码如下:

    function a(&$b) 
    { 
    $b++; 
    } 
    $c = 0; 
    call_user_func('a', &$c); 
    echo $c;//显示 1 
    call_user_func_array('a', array(&$c)); 
    echo $c;//显示 2
    
    <?php
     
    //call_user_func()  返回值:返回回调函数的返回值.
     
    //自定义方法,执行
    function sum($a,$b){
        $c = $a+$b;
        echo $a;
        echo $b;
        echo $c;
    }
    call_user_func('sum','10','20');//102030
    //也可以直接把回调方法写入调用   func_get_args()  获取参数的数组
    call_user_func(function (){ $para = func_get_args(); foreach ($para as $v){ echo $v;} },10,20,13,30);//10201330
     
    //类的使用
    class test{
        function __construct()
        {
            echo 'construct';
        }
     
        public static function sum($a,$b){
            $c = $a+$b;
            echo $a;
            echo $b;
            echo $c;
        }
     
        function __destruct()
        {
            echo 'destruct';
        }
    }
    //其中类的方法没有static修饰会报错:Strict Standards:  非静态方法的错误
    call_user_func(array('test','sum'),'30','40');//304070
    call_user_func('test::sum','30','40');//304070
     
     
    //call_user_func_array()  返回回调函数的结果。如果出错的话就返回FALSE
     
    //实现相似,只是换了一种方式传递了参数,而自己感觉 call_user_func_array() 的写入规则更加清楚
    //方法
    call_user_func_array('sum', array("111", "222"));//111222333
    //也可以直接把回调方法写入调用
    call_user_func_array(function (){ $para = func_get_args(); foreach ($para as $v){ echo $v;} },array(10,20,30,40));//10203040
    //类
    call_user_func_array(array('test','sum'), array("111", "222"));//111222333
    call_user_func_array('test::sum', array("111", "222"));//111222333
     
     
    /*
    call_user_func(),call_user_func_array()使用类的方法 和 new 对象后调用方法 区别
    */
     
    //区别:该使用类的方法和直接new调用的区别,就是有没有触发构造和析构方法
    //该调用了test类中的方法,但是没有调用构造方法,而new对象就会触发构造方法
    $a = new test;
    $a->sum(1,2);//construct123destruct
    
    
    

    相关文章

      网友评论

        本文标题:自定义函数call_user_func和call_user_fu

        本文链接:https://www.haomeiwen.com/subject/pgytbqtx.html