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/

posted @ 2016-04-08 11:35  没事就更  阅读(204)  评论(0编辑  收藏  举报