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));
  • 相关阅读:
    iOS-国家代码选择功能github开源分享
    Nehe OpenGL lesson 8
    POJ 3083:Children of the Candy Corn(DFS+BFS)
    LeetCode 14
    一起talk C栗子吧(第二十二回:C语言实例--队列一)
    高仿手机QQ音乐之——Android带进度条的开关
    11.1 半联结
    oracle调优 浅析有效的游标管理
    经典算法——Jump Game(II)
    从Vue文件到Html文件
  • 原文地址:https://www.cnblogs.com/yangcclg/p/6082814.html
Copyright © 2011-2022 走看看