RSS
热门关键字:  php  lighttpd  找回密码  密码找回  client
当前位置 :| 主页>技术资料>PHP>

php 5.3将提供改进的Lambda函数

来源: 作者: 时间:2008-08-19 Tag:Lambda   php5.3   点击:

文章出处:http://www.ooso.net/index.php/page/2

从前的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

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


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册