在php官网中有回调类型,那什么是回调类型呢。我们知道php中的数据类型有字符串、数字、布尔型、数组等,这些都可以用来做类型约束,类型约束的意思就是指定变量的数据类型。
自 PHP 5.4 起增加了 callable 类型约束, is_callable函数可以检查给定的变量是否是回调类型。就像我们声明一个整数变量后,可以使用is_int函数来进行类型判断一样。
我们先看一下示例中的函数定义,输出的结果后面会讲。从函数的定义就可以看出什么是回调类型了,有一个感性的认识。
示例如下:
function myFunction(int $x){ //将参数x的类型限定为整数
var_dump( is_int($x) );
}
function myFunctionB(callable $x){ //将参数x的类型限定为回调类型
var_dump( is_callable($x) );
}
myFunction(1);
myFunctionB("strtoupper");输出结果:
bool(true)
bool(true)
我们将第二个函数的参数指定为了回调类型。并用is_callable检查了是否是回调类型,结果输出true。
一、回调类型的定义回调类型就是函数,包括了普通函数、匿名函数、类的成员函数、类的静态函数。
这里需要跟php的 Closure 类进行区别一下。Closure是一个类,仅代表了匿名函数。而回调类型包含了各种函数。
官网中也没有明确定义,我这里就给定义一下吧,如有问题,联系我改进。
二、回调类型的使用回调类型既然就是函数,那么如何进行使用呢。典型的使用就是通过PHP内置函数 call_user_func() 使用。
回调类型的表达方式有六种。这六种方式主要分为两个类别,通过字符串传递回调类型和通过数组传递回调类型。
1.普通函数回调,直接使用函数名称字符串
2.类的静态方法回调,使用数组。数组的第一个元素是类名,第二个是静态函数名称
3.对象的普通方法回调,使用数组。数组的第一个元素是对象,第二个是成员函数名称
4: 类的静态方法回调,也可以使用字符串形式。使用::操作符连接类和静态函数
5: 父类的静态方法回调,使用数组。数组的第一个元素是类名,第二个是静态函数名称加上parent
6: 对象回调,实现了__invoke魔术方法的对象,可以直接作为回调类型使用
示例:
//普通全局函数
function my_callback_function() {
echo 'hello world!';
}
class MyClass {
// 类的静态函数
static function myCallbackMethod() {
echo 'Hello World!';
}
// 类的普通函数
function myObjCallbackMethod(){
echo 'Obj method';
}
}
// 1.简单回调,直接使用函数名称字符串
call_user_func('my_callback_function');
// 2.类的静态方法回调,使用数组。数组的第一个元素是类名,第二个是静态函数名称
call_user_func(array('MyClass', 'myCallbackMethod'));
// 3.对象的普通方法回调,使用数组。数组的第一个元素是对象,第二个是成员函数名称
$obj = new MyClass();
call_user_func(array($obj, 'myObjCallbackMethod'));
// 4: 类的静态方法回调,也可以使用字符串形式。使用::操作符连接类和静态函数
call_user_func('MyClass::myCallbackMethod');
// 5: 父类的静态方法回调,使用数组。数组的第一个元素是类名,第二个是静态函数名称加上parent
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
// 6: 对象回调,实现了__invoke魔术方法的对象,可以直接作为回调类型使用
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
三、总结所有的php内置函数和用户自定义函数,都可以使用回调的方式进行使用。回调类型的本质就是函数,但它可以使用字符串和数组进行表示。总共有六种合法的表示方式。
所以在第一个示例中 is_callable("strtoupper") 返回的是true。因为strtoupper是系统的内置函数。
转载请注明出处 谢谢