<?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)); ?>