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