call_user_func 与call_user_func_array 的使用与区别

1 call_user_func 的使用

1)使用方法直接传递值

function nowamagic($a,$b){   

    echo $a;   
    echo $b;   
}   
call_user_func('nowamagic', "111","222");

2)使用类的方法

class Func{
    //静态方法
    static public function _func(){
        $str =  'THE CLASS NAME IS '.__CLASS__.' AND CLASS STATIC METHOD IS '.__METHOD__;
        if(func_num_args()){
            //获取函数参数,获取参数也可以通过给方法设置形参来获取,这里只是没给方法设置形参获取参数的情况
            $arg = func_get_arg(0);
            return $str.' and argument is '.$arg;
        }else{
            return $str;
        }
    }
    //普通方法
    public function __func($num){
        return $num ? $num+1:$num;
    }
}
//传递类的静态方法,有两种方式
//(1)种,传递····类名::方法名····
var_dump(call_user_func("Func::_func",'hell world'));//这里传递参数
//(2)种,传递类名和方法名的数组
var_dump(call_user_func(array('Func','_func')));//这里没有传参数
$num = 4;
$o = new Func;
//传递类普通方法必须用···数组···传递···该类的对象··和···方法名···
$return = call_user_func(array($o,'__func'),$num);
var_dump($return);

 3 使用命名空间的方法

//定义类的命名空间
namespace Home;
class Space{
    //静态方法
    static public function _call($num){
        return $num +=10;
    }
    //普通方法
    public function _func(){
        return func_get_args();//返回函数的参数
    }
}
//针对静态方法,有两种调用方式
//1.可以用array(__NAMESPACE__.'\类名','方法名')传递类方法,也就是:array('命名空间\类名','方法名')
$return = call_user_func(array(__NAMESPACE__.'\Space','_call'),10);
//2.可以用····    __NAMESPACE__.'\类名::方法名'    ···传递类方法,也就是:'命名空间\类名::方法名'
$return1 = call_user_func('Home\Space::_call',100);
var_dump($return);
var_dump($return1);
//针对普通方法,不用传入命名空间即可调用,如下
$o = new Space;
$return = call_user_func(array($o,'_func'),1,2,3,4,5);
var_dump($return);

 

2  call_user_func_array 的使用

call_user_func 不能传递引用

unction 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 
引用
function increment(&$var){
    $var++;
}
$a = 0;
call_user_func('increment', $a);
echo $a; // 0
call_user_func_array('increment', array(&$a)); // You can use this instead  这里注意的地方就是 必须要传引用
echo $a; // 1

 

posted @ 2019-04-27 17:55  做人如水,做事如山  阅读(194)  评论(0编辑  收藏  举报