Callable
类型是指可调用的函数,它的表现形式可以是一个字符串、数组、匿名函数等。
看看这个例子,就非常容易理解了:
// 定义类
class Example{
function foo(){
echo 1;
}
static function bar(){
echo 2;
}
}
// 此时的 $fn1 就是一个 callable
$fn1 = [new Example(), "foo"];
// 输出 1
$fn1();
// 此时的 $fn2 就是一个 callable
$fn2 = ["Example", "bar"];
// 输出 2
$fn2();
// 此时的 $nf3 就是一个 callable
$fn3 = "Example::bar";
// 输出 2
$fn3();
PHP 提供了一个内置的 call_user_func
函数,这个函数接收一个 callable
类型的参数。
自定义函数
// 自定义函数
function my_callback(){
echo 'my_callback <br />';
}
// 调用函数
call_user_func('my_callback');
自定义对象
// 自定义类
class Base{
static function static_callback(){
echo 'base_static_callback <br />';
}
}
class Example extends Base{
public function class_callback(){
echo 'class_callback <br />';
}
static function static_callback(){
echo 'static_callback <br />';
}
}
// 调用类方法
// 第一种、调用静态方法
call_user_func(['Example', 'static_callback']);
call_user_func('Example::static_callback');
// 还可以调用父类的静态方法
call_user_func(['Example', 'parent::static_callback']);
// 第二种、普通方法和静态方法都可以、但需要是公开的方法
$example = new Example();
call_user_func([$example, 'class_callback']);
细化理解
class Example{
// 接受一个callable和一个字符串参数
static function action(callable $callback, string $say){
// print_r($callback);
$callback($say);
}
// 做点什么?
static function doSomeThink($say){
echo $say . '<br />';
}
}
// 当 callable 是一个数组的时候
Example::action(['Example', 'doSomeThink'], 'i love php');
// 当 callable 是一个字符串到时候
Example::action('Example::doSomeThink', 'i love php');
// 当 callable 是一个匿名函数的时候
Example::action(function($say){
echo $say . '<br />';
}, 'i love php');