首页 > 代码库 > PHP 回调、匿名函数和闭包
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("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 回调、匿名函数和闭包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。