php 回调函数
在PHP5.4以后加入了类型,指的就是PHP中可以用作回调函数的函数名称。
可能大家最常使用回调函数的地方,就是在usort()中了。比如二维数组的自定义排序:
$stars = array(
array('name' => 'psy', 'style' => 9, 'funny' => 8),
array('name' => 'hkt', 'style' => 0, 'funny' => 9),
array('name' => 'ladygaga', 'style' => 8, 'funny' => 7),
);
function cmp_style($a, $b){
return $a['style'] < $b['style'];
}
usort($stars, 'cmp_style'); // cmp_style是函数名,它就是一个回调函数
var_dump($stars)
/* Output:
array(3) {
[0]=>
array(3) {
["name"]=>
string(3) "psy"
["style"]=>
int(9)
["funny"]=>
int(8)
}
[1]=>
array(3) {
["name"]=>
string(8) "ladygaga"
["style"]=>
int(8)
["funny"]=>
int(7)
}
[2]=>
array(3) {
["name"]=>
string(3) "hkt"
["style"]=>
int(0)
["funny"]=>
int(9)
}
}
*/
可见,在使用回调函数的时候,是将这个函数的函数名字符串作为参数来传递的。
PHP中可以使用用户自定义的function和PHP内置的function来做回调函数。
其实在PHP中,回调函数不只是简单的function,还可以用类的成员函数、类的静态函数以及对象的方法来做回调函数。
比如:
class Star_sort {
static function cmp_style($a, $b){
return $a['style'] < $b['style'];
}
}
// 1. Static class method call
usort($stars, array('Star_sort', 'cmp_style')); // 没错, array('类名', '成员函数名');
var_dump($stars);
// 2. Object method call
$obj = new Star_sort();
usort($stars, array($obj, 'cmp_style'));
var_dump($stars);
// 3. Static class method call
usort($stars, array('Star_sort::cmp_style'));
var_dump($stars);
// 4. Relative static class method call
class Star_rsort extends Star_sort{
static function cmp_style($a, $b){
return $a['style'] > $b['style'];
}
}
usort($stars, array('Star_rsort', 'parent::cmp_style'));
var_dump($stars);
// 都会有和上面一样的输出
usort($stars, array('Star_rsort', 'cmp_style')); // 会输出反向的排序
var_dump($stars);
除此之外,回调函数还可以在调用的时候,利用create_function()来即时创建一个匿名函数。比如:
usort($stars, create_function('$a, $b', 'return $a[\'style\'] < $b[\'style\'];'));
var_dump($stars);
平时我们常用回调函数的地方还有array_walk(), call_user_func()等等,用好了可以大大节省开发时间和缩短代码长度,同时就提高了工作效率和减少bug了。
原文链接:http://www.fancycedar.info/2012/11/php-callbacks/