Callable
類型是指可調(diào)用的函數(shù),它的表現(xiàn)形式可以是一個(gè)字符串、數(shù)組、匿名函數(shù)等。
看看這個(gè)例子,就非常容易理解了:
// 定義類
class Example{
function foo(){
echo 1;
}
static function bar(){
echo 2;
}
}
// 此時(shí)的 $fn1 就是一個(gè) callable
$fn1 = [new Example(), "foo"];
// 輸出 1
$fn1();
// 此時(shí)的 $fn2 就是一個(gè) callable
$fn2 = ["Example", "bar"];
// 輸出 2
$fn2();
// 此時(shí)的 $nf3 就是一個(gè) callable
$fn3 = "Example::bar";
// 輸出 2
$fn3();
PHP 提供了一個(gè)內(nèi)置的 call_user_func
函數(shù),這個(gè)函數(shù)接收一個(gè) callable
類型的參數(shù)。
自定義函數(shù)
// 自定義函數(shù)
function my_callback(){
echo 'my_callback <br />';
}
// 調(diào)用函數(shù)
call_user_func('my_callback');
自定義對(duì)象
// 自定義類
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 />';
}
}
// 調(diào)用類方法
// 第一種、調(diào)用靜態(tài)方法
call_user_func(['Example', 'static_callback']);
call_user_func('Example::static_callback');
// 還可以調(diào)用父類的靜態(tài)方法
call_user_func(['Example', 'parent::static_callback']);
// 第二種、普通方法和靜態(tài)方法都可以、但需要是公開的方法
$example = new Example();
call_user_func([$example, 'class_callback']);
細(xì)化理解
class Example{
// 接受一個(gè)callable和一個(gè)字符串參數(shù)
static function action(callable $callback, string $say){
// print_r($callback);
$callback($say);
}
// 做點(diǎn)什么?
static function doSomeThink($say){
echo $say . '<br />';
}
}
// 當(dāng) callable 是一個(gè)數(shù)組的時(shí)候
Example::action(['Example', 'doSomeThink'], 'i love php');
// 當(dāng) callable 是一個(gè)字符串到時(shí)候
Example::action('Example::doSomeThink', 'i love php');
// 當(dāng) callable 是一個(gè)匿名函數(shù)的時(shí)候
Example::action(function($say){
echo $say . '<br />';
}, 'i love php');