• 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));
  • 相关阅读:
    python 语法
    python调试
    08 ES6 基本介绍
    微信小程序中 一些封装的函数
    07 豆瓣小程序项目
    06自定义组件 和 网络请求api
    05 常用组件 和 小程序WXS语法
    04小程序逻辑层App() ,Page() 中的生命周期函数 和 页面路由(页面栈 )
    03小程序的WXSS 和 flex 布局
    02小程序的WXML 和 事件
  • 原文地址:https://www.cnblogs.com/yangcclg/p/6082814.html
Copyright © 2020-2023  润新知