php调用回调函数:call_user_func_array

282次阅读
没有评论

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

说明

call_user_func_array (callable $callback , array $param_arr) : mixed
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

参数

  • callback:被调用的回调函数。
  • param_arr:要被传入回调函数的数组,这个数组得是索引数组。

返回值 :返回回调函数的结果。如果出错的话就返回 FALSE

示例

示例 1:使用 call_user_func_array 执行 fnCallBack 函数

function fnCallBack($msg1 , $msg2){
    echo 'msg1:'.$msg1;
    echo "<br />\n";
    echo 'msg2:'.$msg2;
}

$fnName = "fnCallBack";
$params = ['hello' , 'world'];

call_user_func_array($fnName , $params);

示例 2:使用 call_user_func_array 调用静态方法

namespace Foobar;

class MyClass
{public static function fnCallBack( $msg1 , $msg2)
    {
        echo 'msg1:'.$msg1;
        echo "<br />\n";
        echo 'msg2:'.$msg2;
    }
}


//call_user_func_array([ 'MyClass', 'fnCallBack'] , ['hello' , 'world']);
call_user_func_array(__NAMESPACE__ .'\MyClass::fnCallBack' , [ 'hello' , 'world']);

示例 3:使用 call_user_func_array 调用对象方法

class MyClass
{
    private $name = 'abc';

    public function fnCallBack($msg1 = 'default msg1' , $msg2 = 'default msg2')
    {
        echo 'object name:'.$this->name;
        echo "<br />\n";
        echo 'msg1:'.$msg1;
        echo "<br />\n";
        echo 'msg2:'.$msg2;
    }
}

$myobj = new MyClass();

call_user_func_array([ $myobj, 'fnCallBack'] , ['hello' , 'world']);

使用场景

1. 动态调用普通函数时,比如参数和调用方法名称不确定的时候很好用,函数名可以用参数的方式传递进去,因而调用不同函数。

配合 func_get_args() 函数接收参数到数组中,参数的个数也不一致。

function sayEnglish($fName, $content) {echo 'I am' . $content;}

function sayChinese($fName, $content, $country) {
    echo $content . $country;
    echo "<br>";
}

function say() {$args = func_get_args();
    call_user_func_array($args[0], $args);
}

say('sayChinese', '我是', '中国人');
say('sayEnglish', 'Chinese');

2. 不需要判断函数类型,无论是普通函数,类的静态方法或者类的方法,均直接调用,你就不用去判断方法的类型。

A::sayChinese 是类的静态方法 通过 call_user_func_array,依然可以调用。

class A {public static function sayChinese($fName, $content, $country) {echo '你好'}
}

function say() {$args = func_get_args();
    call_user_func_array(['A', 'sayChinese'], $args);
}
正文完
有偿技术支持加微信
post-qrcode
 
评论(没有评论)
验证码