您的位置:首页 > 编程语言 > PHP开发

php 5.3将提供改进的Lambda函数

2008-07-26 12:38 555 查看

从前的lambda函数

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

PLAIN
TEXT
CODE:

<?php

$newfunc
= create_function('$a,$b', 'return
"ln($a) + ln($b) = " . log($a * $b);');

echo
"New anonymous function: $newfunc/n";

echo
$newfunc(2, M_E) . "/n";

// outputs

// New anonymous function:
lambda_1

// ln(2) + ln(2.718281828459) =
1.6931471805599

?>

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

php 5.3的lambda函数语法

改进的lambda基本语法

PLAIN
TEXT
CODE:

function
& (parameters) use (lexical vars) { body }

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

PLAIN
TEXT
CODE:

$lambda
= function () { echo "Hello World!/n"; };

调用方法很多

PLAIN
TEXT
CODE:

$lambda
();

call_user_func
($lambda);

call_user_func_array
($lambda, array ());

在函数中的简单调用

PLAIN
TEXT
CODE:

function
replace_spaces ($text) {


$replacement = function ($matches) {


return str_replace ($matches[1], ' ', ' ').' ';


};


return preg_replace_callback ('/( +) /', $replacement, $text);

}

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

PLAIN
TEXT
CODE:

function
getAdder($x) {


return function ($y) use ($x) {


// or: lexical
$x;


return $x + $y;


};

}

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

PLAIN
TEXT
CODE:

function
replace_in_array ($search, $replacement,
$array) {


$map = function ($text) use ($search, $replacement) {


if (strpos ($text, $search)> 50) {


return str_replace ($search, $replacement,
$text);


} else {


return $text;


}


};


return array_map ($map,
$array);

}

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

原文见:Request for Comments: Lambda
functions and closures
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: