博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php闭包使用例子
阅读量:6575 次
发布时间:2019-06-24

本文共 2324 字,大约阅读时间需要 7 分钟。

一.依据闭包实现一个容器

class Di{    private $factory;     public function set($id, $value)    {        $this->factory[$id] = $value;    }     public function get($id)    {        $val = $this->factory[$id];        return $val();//如果不加括号,仅仅返回的是闭包类,并不是User实例    }} class User{    private $username;     public function __construct($username = '')    {        $this->username = $username;    }     public function getUserName()    {        return $this->username;    }} $di = new Di(); // 在此使用了闭包,所以实际上并不会实例化User类,只有在后面get的时候才会实例化$di->set('a', function(){    return new User('张三');}); var_dump($di->get('a')->getUserName());

二.使用闭包作为回调

class Cart{    CONST PRICE_BUTTER = 1.0;    CONST PRICE_MILK = 5.05;     protected $products = [];     public function add($product, $quantity)    {        $this->products[$product] = $quantity;    }     public function getQuantity($product)    {        return isset($this->products[$product]) ? $this->products[$product]: false;    }     public function getTotal($tax)    {        $total = 0.00;        $callback = function($quantity, $product) use ($tax, &$total) {            $priceItem = constant(__CLASS__ . '::PRICE_' . strtoupper($product));            $total += ($priceItem * $quantity) * ($tax + 1.0);        };         array_walk($this->products, $callback);        return round($total, 2);    }} $cart = new Cart();$cart->add('butter', 1);$cart->add('milk', 5); echo $cart->getTotal(0.05);

三.使用闭包函数调用类中方法

class Grid{    protected $builder;    protected $attribute;     public function __construct(Closure $builler)    {        $this->builder = $builler;    }     public function addColumn($name, $value)    {        $this->attribute[$name] = $value;        return $this;    }     public function build()    {        // 这儿回调闭包函数,参数为this        call_user_func($this->builder, $this);    }     public function __toString()    {        $this->build();         $str = '';        $call = function($val, $key) use(&$str) {             $str .= "$key=>$val;";        };        array_walk($this->attribute, $call);         return $str;    }} $grid = new Grid(    // 传入闭包函数,带参数    function($grid) {        $grid->addColumn('key1', 'val1');        $grid->addColumn('key2', 'val2');    }); echo $grid;

 

 

 

 

关联文章:http://www.cnblogs.com/fps2tao/p/8727482.html

 

转:https://www.cnblogs.com/itfenqing/p/7073307.html

 

你可能感兴趣的文章
C#动态代理
查看>>
使用 sessionStorage 创建一个本地存储的 name/value
查看>>
POJ2127 LICS模板
查看>>
Python笔记8----DataFrame(二维)
查看>>
JavaScript 特殊效果代码
查看>>
【?】codeforces721E Road to Home(DP+单调队列)
查看>>
MySQL 仅保留7天、一个月数据
查看>>
OGG 11g Checkpoint 详解
查看>>
PHP中使用socket通信响应速度慢的原因与解决办法
查看>>
Win7下安装Mysql(解压缩版)
查看>>
UVA 11992 Fast Matrix Operations (降维)
查看>>
Asp.net core Identity + identity server + angular 学习笔记 (第一篇)
查看>>
暂时不想读研的几点理由
查看>>
增加临时表空间组Oracle11g单实例
查看>>
Diff Two Arrays
查看>>
stark组件(1):动态生成URL
查看>>
169. Majority Element
查看>>
下拉菜单
查看>>
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>