回调函数就是以函数作为参数,这样允许了底层调用高层设计的函数。
<?php
//回调函数
class product{
public $name;
public $price;
function __construct($name,$price){
$this->name = $name;
$this->price = $price;
}
}
class Saler{
private $callbacks;
function registerCallback($callback){
if(! is_callable($callback)){
throw new Exception("callback not callable");
}
$this->callbacks[] = $callback;
}
function sale($product){
print "{$product->name}:processing\n";
foreach($this->callbacks as $callback){
call_user_func($callback,$product);
}
}
}
$logger = create_function('$product','print " logging({$product->name})\n";' );
$logprice = create_function('$product','print " logging({$product->price})\n";');
$saler = new saler();
$saler->registerCallback($logger);
$saler->registerCallback($logprice);
$saler->sale(new product("shoes",6));
print "\n";
$saler->sale(new product("coffee",23));
?>
回调不一定是匿名的,比如:
function logger($product)
{
print "logging({$product->price})";
}
$saler->registerCallback("logger");
//回调函数也可以是对象的方法
class customer{
function consume($product){
print "consume({$product->name})\n";
}
}
$saler->registerCallback(array(new customer(),"consume"));