回调函数

回调函数

定义

​ 一些函数如call_user_func()usort()可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

特点

  • PHP是将函数以string形式传递的。
  • 可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
  • 一个已实例化的 object 的方法被作为 array 传递,下标 0 包含该 object,下标 1 包含方法名。 在同一个类里可以访问 protected 和 private 方法。
  • 静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。
  • 除了普通的用户自定义函数外,也可传递匿名函数给回调参数。

简单调用

<?php
// An example callback function
function my_callback_function() {
    echo 'hello world!';
}

call_user_func('my_callback_function'); 

# 结果
// hello world!

类的调用

调用类的静态方法

<?php
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Hello World!

调用类的方法

<?php
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

call_user_func(array('MyClass', 'myCallbackMethod'));
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

//Hello World!

调用父类方法

<?php

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
call_user_func(array('B', 'who')); // B

__invoke魔术方法

<?php

class C {
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');
?>

//Hello PHP!

匿名函数

Closure的实例

<?php
// Our closure
$double = function($a) {
    return $a * 2;
};

// This is our range of numbers
$numbers = range(1, 5);

// Use the closure as a callback here to 
// double the size of each element in our 
// range
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
// 2 4 6 8 10
?>

results matching ""

    No results matching ""