標籤:llb return count public cal color struct 閉包 int
<?phpclass 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("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";‘);$processor = new ProcessSale();$processor->registerCallback($logger);$processor->sale(new Product("shoes", 6));print "\n";$processor->sale(new Product("coffee", 6));$logger2 = function($product){ print " logging ({$product->name})\n";};$processor = new ProcessSale();$processor = new ProcessSale();$processor->registerCallback($logger2);$processor->sale(new Product("shoes", 6));print "\n";$processor->sale(new Product("coffee", 6));class Mailer{ function doMail($product){ print " mailing ({$product->name})\n"; }}$processor = new ProcessSale();$processor->registerCallback(array(new Mailer(), "doMail"));$processor->sale(new Product("shoes", 6));print "\n";$processor->sale(new Product("coffee", 6));class Totalizer{ static function warnAmount(){ return function($product){ if ($product->price > 5){ print " reached high price: {$product->price}\n"; } }; }}$processor = new ProcessSale();$processor->registerCallback(Totalizer::warnAmount());//.....class TotalizerNew{ static function warnAmount($amt){ $count = 0; return function($product) use ($amt, &$count){ $count += $product->price; print " count: $count\n"; if ($count > $amt){ print " high price reached:{$count}\n"; } }; }}$processor = new ProcessSale();$processor->registerCallback(TotalizerNew::warnAmount(8));$processor->sale(new Product("shoes", 6));print "\n";$processor->sale(new Product("coffee", 6));
PHP 回調、匿名函數和閉包