<?php
class Product{
public $name;
public $price;
function __construct($name, $price){
$this->name = $name;
$this->price = $price;
}
}
class ProcessSale{
private $callbacks;
function registerCallback($callback){
if(!is_callable($callback)){
throw new Exception("allback not callable");
}
$this->callbacks[] = $callback;
}
function sale($product){
print "{$product->name}:processing \n";
foreach ($this->callbacks as $callback) {
call_user_func($callback, $product);
}
}
}
class Mailer{
function doMail($product){
print "mailing({$product->name})<br/>";
}
}
class Totalizer{
static function warnAmount($amt){
$count = 0;
// return function ($product){
// if($product->price > 5){
// print "reached high price: {$product->price}<br />";
// }
// };
return function ($product) use ($amt, &$count){
$count += $product->price;
print "count: $count <br />";
if($count > $amt){
print "high price reached:{$count} <br>";
}
};
}
}
// $logger = create_function('$product',
// 'print "logging({$product->name})\n";' );
// $logger2 = function($product){
// print "logging ({$product->name})<br/>";
// };
$processor = new ProcessSale();
// $processor->registerCallback($logger2);
// $processor->registerCallback(array( new Mailer(), "doMail"));
$processor->registerCallback(Totalizer::warnAmount(8));
$processor->sale( new Product("shose", 6));
print "<br>";
$processor->sale( new Product("coffee", 6));
?>