从php5.3以后,php也可以使用lambda function(可能你会觉得是匿名函数,的确是但不仅仅是)来写类似javascript风格的代码:

$myFunc = function() { echo 'Hello World';};

$myFunc();

当一个函数的参数是另一个函数(callback)的时候,就会显得相当有用:

$input = array(1, 2, 3, 4, 5);

$output = array_filter($input, function ($v) { return $v > 2; });

这样就不用单独再把函数定义写在前面

有的人可能会说使用create_function函数也可以,不过所有php ide都不支持字符串的内的代码高亮功能,而create_function函数的函数实现却是用的字符串方式。另外还有一个性能问题。

那什么时候使用闭包呢?

还是继续以上面的例子说明,如果我有好多地方都会按数组的大小过滤函数,但过滤的值并不是确定的,比如上面的例子是值大于2的就保留,那如果有的是值大于3的就保留,有的只要是正数就保留,这代码怎么写最好?

这个时候,就需要闭包出马了:

$max_comparator = function ($max){ return function ($v) use ($max) { return $v > $max; };};

$input = array(1, 2, 3, 4, 5);

$output = array_filter($input, $max_comparator(2));

闭包其实可以理解为返回另外一个函数的函数(当然不是这么简单的,刚学闭包的时候可以暂时这么理解)


还有一个使用lambda函数而不使用create_function的一个理由是效率问题,国外找到一个测试结果:

1 - with a "standard" function
2 - with a lambda function
3 - by using create_function()

For 50, 000 iterations on my laptop, here are the time spent for each implementation:

1 - 240 ms
2 - 200 ms
3 -1200 ms

So, lambda functions are as fast as "standard" PHP functions.

Php5.3的lambda函数以及closure(闭包)的更多相关文章

  1. 深入理解Lambda函数及其用法

    Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函数 ...

  2. Python——lambda函数

    Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 好比电影里面的群众演员,往 ...

  3. Lambda函数及其用法

    Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行? 当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函 ...

  4. [易学易懂系列|rustlang语言|零基础|快速入门|(7)|函数Functions与闭包Closure]

    [易学易懂系列|rustlang语言|零基础|快速入门|(7)函数Functions与闭包Closure] 有意思的基础知识 函数Functions与闭包Closure 我们今天再来看看函数. 在Ru ...

  5. 深入理解php 匿名函数和 Closure

    而在PHP 5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP ...

  6. 【C++11】新特性——Lambda函数

    本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...

  7. PHP Closure(闭包)类详解

    Closure 面向对象变成语言代码的复用主要采用继承来实现,而函数的复用,就是通过闭包来实现.这就是闭包的设计初衷. 注:PHP里面闭包函数是为了复用函数而设计的语言特性,如果在闭包函数里面访问指定 ...

  8. deep_learning_Function_ lambda函数详解

    这里总结了关于 Python 中的 lambda 函数的“一个语法,三个特性,四个用法”. 一个语法: 在 Python 中,lambda 函数的语法是唯一的.其形式如下: lambda argume ...

  9. lambda函数小结

    C++中的lambda函数 lambda函数是函数式编程中的概念,由C++11引入,成为现代C++中重要的特性. 所谓lambda函数就是匿名函数,语法结构: [capture list] (para ...

随机推荐

  1. 【字母树+贪心】【HDU3460】【Ancient Printer】

    题目大意: 一个打印机 只有 打印,删除,a-z.操作 给你一堆队名,如何才能操作次数最少输出全部 (字典树节点数-1)*2 输入,删除操作数 字符串数 printf操作数 最长字符串的长度 最后一个 ...

  2. 【Trie】【HDU1247】【Hat’s Wordsfd2】

    题目大意: hat's word 的定义是字典中 恰好由另外两个单词连接起来的单词 给你一本字典,问有多少个hat's word,(字典按字典序给出) 单词数50000.. 初步思路: 单词分为前缀单 ...

  3. js在线题目

    在线题目: https://www.nowcoder.com/ta/js-assessment

  4. ASP.NET后台自定义导出Excel

    关于导出,属于老生常谈了,下面就总结下我自己遇到的一些导出吧. 1.使用Excel组件进行导出(需要安装Microsoft Office Excel). 下面为代码,希望可以帮助别人. 1)准备数据源 ...

  5. [Linked List]Palindrome Linked List

    Total Accepted: 29652 Total Submissions: 117516 Difficulty: Easy Given a singly linked list, determi ...

  6. js问题学习

    1.前言为了node.js做准备,js的基本功还是很重要的.所以正值1024程序员节的时候所以找了些题目,整理了一下知识点.这篇文章感觉代码太多,难免枯燥,所以文章最后留了个彩蛋给读者. 2.简单回调 ...

  7. jsoup_解析任意网站,做任意网站客户端

    jsoup是一个解析网页源码的开源库,他能按照给定的规则提取出一个网页中的任意元素,和其他网页解析库不同的是,他提取网页内容的方式和css.jquery的选择器非常相似.因此如果你懂得前端的知识,只需 ...

  8. 判断是否联网_检测网络的类型为3G、2G、wap、wifi

    判断是否联网_检测网络的类型为3G.2G.wap.wifi  判断是否联网: /*** * judge Internet is available * * @author wei-spring * @ ...

  9. Array 的五种迭代方法 -----every() /filter() /forEach() /map() /some()

    ES5定义了五个迭代方法,每个方法都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象(可选的),作用域对象将影响this的值.传入这些方法中的函数会接收三个参数:数组的项的值.该项在数组中 ...

  10. Http Analyzer 数据抓包

    一.工具简介 这是一款实时分析 HTTP/HTTPS 数据流的工具.它可以实时捕捉HTTP/HTTPS 协议数据,可以显示许多信息(包括:文件头.内容.Cookie.查询字符窜.提交的数据.重定向的U ...