在开发系统的过程中,有时候希望针对一个对象或者一个值执行多个不相干的操作,那么此时运用回调将是最好的方式,回调函数可以是匿名函数、非匿名函数以及静态方法。
class Person{
public $name;
public $age;
function __construct($name, $age){
$this->name = $name;
$this->age = $age;
}
}
class ProcessHire{
private $callbacks;
// 注册回调方法
function registerCallback($callback){
if (!is_callable($callback)){
throw new Exception("callback not callable");
}
$this->callbacks[] = $callback;
}
// 逐一执行回调方法,并发参数传入回调方法
function hire($person){
print "Hiring {$person->name}:<br>";
foreach ($this->callbacks as $callback){
call_user_func($callback, $person);
}
}
}
// 匿名函数作为回调函数
$fun=create_function('$person','print "importting ({$person->name})";');
$processor = new ProcessHire();
$processor->registerCallback($fun);
$processor->hire(new Person("LiFang", 20));
print "<br>";
$processor->hire(new Person("LiuMing", 23));
执行结果:
Hiring LiFang:
importting (LiFang)
Hiring LiuMIng:
importting (LiuMing)
// 非匿名函数作为回调函数
class Sign{
function signContract($person){
print "sign a contract with {$person->name}<br>";
}
}
$processor = new ProcessHire();
// 这里传入的是数组,而且第一个是对象实例,第二个是函数名称
$processor->registerCallback(array(new Sign(), "signContract"));
//$processor->registerCallback(array("Sign", "signContract")); 也可以这么写,包括静态方法
$processor->hire(new Person("LiFang", 20));
print "<br>";
$processor->hire(new Person("LiuMing", 23));
执行结果:
Hiring LiFang:
sign a contract with LiFang
Hiring LiuMIng:
sign a contract with LiuMing
// 静态方法作为回调函数
class Check{
static function checkAge($maxAge){
$age = 0;
return function($person) use($maxAge, $age){
$age = $person->age;
print "check: $age<br>";
if ($age>$maxAge){
print "age is too hight: $age";
}
};
}
}
$processor = new ProcessHire();
$processor->registerCallback(Check::checkAge(40));
$processor->hire(new Person("LiFang", 20));
print "<br>";
$processor->hire(new Person("LiuMing", 43));
执行结果:
Hiring LiFang:
check: 20
Hiring LiuMIng:
check: 43
age is too hight: 43
当让,你可以根据需要同时注册多个不相干的方法,这样,系统就会调用多个方法来处理你传入的对象了。