PHP回调函数

在开发系统的过程中,有时候希望针对一个对象或者一个值执行多个不相干的操作,那么此时运用回调将是最好的方式,回调函数可以是匿名函数、非匿名函数以及静态方法,看下面例子。
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


当让,你可以根据需要同时注册多个不相干的方法,这样,系统就会调用多个方法来处理你传入的对象了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值