zoukankan      html  css  js  c++  java
  • 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 
    ";
            foreach ($this->callbacks as $callback){
                call_user_func($callback, $product);
            }
        }
    }
    
    $logger = create_function('$product', 'print "   logging ({$product->name})
    ";');
    
    $processor = new ProcessSale();
    $processor->registerCallback($logger);
    
    $processor->sale(new Product("shoes", 6));
    print "
    ";
    $processor->sale(new Product("coffee", 6));
    
    
    $logger2 = function($product){
        print "  logging ({$product->name})
    ";
    };
    
    $processor = new ProcessSale();
    
    $processor = new ProcessSale();
    $processor->registerCallback($logger2);
    
    $processor->sale(new Product("shoes", 6));
    print "
    ";
    $processor->sale(new Product("coffee", 6));
    
    class Mailer{
        function doMail($product){
            print "  mailing ({$product->name})
    ";
        }
    }
    
    $processor = new ProcessSale();
    $processor->registerCallback(array(new Mailer(), "doMail"));
    
    $processor->sale(new Product("shoes", 6));
    print "
    ";
    $processor->sale(new Product("coffee", 6));
    
    class Totalizer{
        static function warnAmount(){
            return function($product){
                if ($product->price > 5){
                    print "  reached high price: {$product->price}
    ";
                }
            };
        }
    }
    
    $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
    ";
                if ($count > $amt){
                    print "  high price reached:{$count}
    ";
                }
            };
        }
    }
    
    $processor = new ProcessSale();
    $processor->registerCallback(TotalizerNew::warnAmount(8));
    
    $processor->sale(new Product("shoes", 6));
    print "
    ";
    $processor->sale(new Product("coffee", 6));
  • 相关阅读:
    GridView多行多列合并单元格(指定列合并)
    项目管理知识体系指南PMBOK指南
    作业调度框架 Quartz.NET 2.0 beta 发布
    外语学习有助于大脑发育
    抢书之JS版
    mac 安装python和Django开发环境
    戏谈一道面试题
    —安装时填写注册表
    深入浅出SQL Server Replication第一篇:走近Replication(上)
    IIS寄宿方式的Web地址、BaseAddress和EndPoint Address的关系
  • 原文地址:https://www.cnblogs.com/yangcclg/p/6082814.html
Copyright © 2011-2022 走看看