1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | <?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)); ?> |