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));
  • 相关阅读:
    网站统计中的数据收集原理及实现
    启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
    淘宝(大数据库应用)--转载
    MapReduce作业的map task和reduce task调度参数
    Spark和Hadoop作业之间的区别
    分析MapReduce执行过程
    MapReduce框架Partitioner分区方法
    LVS+keepalived实现负载均衡
    Tomcat 详解
    linux Tomcat restart脚本简单版
  • 原文地址:https://www.cnblogs.com/yangcclg/p/6082814.html
Copyright © 2011-2022 走看看