php匿名函数和闭包

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


?>