php 5.3将提供改进的Lambda函数

从前的lambda函数

在php里面,传统方法是利用create_function来建立lambda函数,老实说,这个创建过程比较麻烦。拿php手册上的例子来说:

CODE:
  1. <?php
  2. $newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
  3. echo "New anonymous function: $newfunc\n";
  4. echo $newfunc(2, M_E) . "\n";
  5. // outputs
  6. // New anonymous function: lambda_1
  7. // ln(2) + ln(2.718281828459) = 1.6931471805599
  8. ?>

上头这样一段代码,恐怕一时半会还看不明白$newfunc到底是怎样的一个lambda函数。

php 5.3的lambda函数语法

改进的lambda基本语法

CODE:
  1. function & (parameters) use (lexical vars) { body }

创建一个简单lambda函数的例子。下面的例子看上去,语法和javascript甚至很接近了,对于我这样一个由javascript入门到php来的coder来说,这样的代码真是让人瞅着亲切。代码最后的;号是不可省略的,否则会碰到语法错误。

CODE:
  1. $lambda = function () { echo "Hello World!\n"; };

调用方法很多

CODE:
  1. $lambda ();
  2. call_user_func ($lambda);
  3. call_user_func_array ($lambda, array ());

在函数中的简单调用

CODE:
  1. function replace_spaces ($text) {
  2.     $replacement = function ($matches) {
  3.     return str_replace ($matches[1], ' ', '&nbsp;').' ';
  4.     };
  5.     return preg_replace_callback ('/( +) /', $replacement, $text);
  6. }

甚至可以把lambda函数作为结果返回,这样引申的语法变化会相当丰富,想想javascript就知道了

CODE:
  1. function getAdder($x) {
  2.     return function ($y) use ($x) {
  3.         // or: lexical $x;
  4.         return $x + $y;
  5.     };
  6. }

还可以导入外部变量到lambda函数,通过关键字use完成。如果没有这个关键字,以前可能要通过global来传递这些变量。

CODE:
  1. function replace_in_array ($search, $replacement, $array) {
  2.     $map = function ($text) use ($search, $replacement) {
  3.         if (strpos ($text, $search)> 50) {
  4.              return str_replace ($search, $replacement, $text);
  5.         } else {
  6.              return $text;
  7.         }
  8.     };
  9.     return array_map ($map, $array);
  10. }

这个patch由Christian Seiler, Dmitry Stogov提供,目前已经加入到php 5.3。

原文见:Request for Comments: Lambda functions and closures

作者: Volcano 发表于July 21, 2008 at 9:32 am

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原始出处作者信息及此声明

Tags:

17 条评论 »

  1. gougou 于 2008-07-21 @ 10:13:38 留言

    sexy了,不过不知道效率咋样:P

  2. Volcano 于 2008-07-21 @ 10:22:01 留言

    可以到snaps.php.net上面抓一个php 5.3回来测试一下

  3. 神仙 于 2008-07-21 @ 10:46:21 留言

    已经在snaps里出现了?
    我还以为这玩意要到5.4呢

  4. Volcano 于 2008-07-21 @ 10:55:07 留言

    这样看是已经加到php 5.3了

    The patches were already applied to PHP_5_3 and HEAD (with some minor modifications and fixes).

  5. liuxingyuyuni 于 2008-07-21 @ 18:24:03 留言

    哇,这个改进不错啊,哈哈 ^_^

  6. 阿熊 于 2008-07-22 @ 22:08:15 留言

    终于php也有闭包了,哈哈,有意思的补丁,以后服务端代码和客户端代码都混搭了~~

  7. 走秀 于 2008-07-23 @ 19:01:46 留言

    工作环境约束,一直只用4.X

  8. 神仙 于 2008-07-24 @ 21:29:59 留言

    看php的todo,
    新的bt功能真是多

  9. 暮色今晨 于 2008-07-24 @ 23:15:23 留言

    希望PHP 越来越好

  10. 西风的小孩 于 2008-07-26 @ 15:12:17 留言

    SO good.

  11. 快递网点 于 2008-09-04 @ 14:30:05 留言

    PHP版本升级太快的点吧。
    其实我们需要的是一个稳定的版本还不是版本的高低

  12. skyblue 于 2008-12-30 @ 02:22:23 留言

    越来越动态化了..
    赞.

  13. lxrm 于 2009-01-16 @ 14:41:53 留言

    爽啊,哈哈,可以像javascript一样写函数了呀,一直觉得这个够强大的哈

  14. auex 于 2009-01-28 @ 20:41:57 留言

    期待着php6能早点出来

  15. diyism 于 2009-05-15 @ 13:12:21 留言

    我试了php 5.3.0RC3 2009.5.15, 闭包还没有支持:
    function($v){echo $v;}(’hello’);
    或(function($v){echo $v;})(’hello’);
    或($fun=function($v){echo $v;})(’hello’);
    都不行.

    仍然只能:
    $fun=function($v){echo $v;};
    $fun(’hello’);

  16. diyism 于 2009-05-15 @ 13:23:57 留言

    到这里留言支持 添加闭包功能 吧:
    http://bugs.php.net/bug.php?id=47515

  17. Volcano 于 2009-05-15 @ 14:28:49 留言

    你一定是个深度的js程序员,很多php程序员不适应这种写法。
    不过还是支持

RSS 为此帖反馈评论

留条评论