PHP回调函数

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值