php 5.3将提供改进的Lambda函数
从前的lambda函数
在php里面,传统方法是利用create_function来建立lambda函数,老实说,这个创建过程比较麻烦。拿php手册上的例子来说:
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基本语法
CODE:
-
function & (parameters) use (lexical vars) { body }
创建一个简单lambda函数的例子。下面的例子看上去,语法和javascript甚至很接近了,对于我这样一个由javascript入门到php来的coder来说,这样的代码真是让人瞅着亲切。代码最后的;号是不可省略的,否则会碰到语法错误。
CODE:
-
$lambda = function () { echo "Hello World!\n"; };
调用方法很多
CODE:
-
$lambda ();
-
call_user_func ($lambda);
-
call_user_func_array ($lambda, array ());
在函数中的简单调用
CODE:
-
function replace_spaces ($text) {
-
$replacement = function ($matches) {
-
return str_replace ($matches[1], ' ', ' ').' ';
-
};
-
return preg_replace_callback ('/( +) /', $replacement, $text);
-
}
甚至可以把lambda函数作为结果返回,这样引申的语法变化会相当丰富,想想javascript就知道了
CODE:
-
function getAdder($x) {
-
return function ($y) use ($x) {
-
// or: lexical $x;
-
return $x + $y;
-
};
-
}
还可以导入外部变量到lambda函数,通过关键字use完成。如果没有这个关键字,以前可能要通过global来传递这些变量。
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
作者: Volcano 发表于July 21, 2008 at 9:32 am
gougou 于 2008-07-21 @ 10:13:38 留言 :
sexy了,不过不知道效率咋样:P
Volcano 于 2008-07-21 @ 10:22:01 留言 :
可以到snaps.php.net上面抓一个php 5.3回来测试一下
神仙 于 2008-07-21 @ 10:46:21 留言 :
已经在snaps里出现了?
我还以为这玩意要到5.4呢
Volcano 于 2008-07-21 @ 10:55:07 留言 :
这样看是已经加到php 5.3了
liuxingyuyuni 于 2008-07-21 @ 18:24:03 留言 :
哇,这个改进不错啊,哈哈 ^_^
阿熊 于 2008-07-22 @ 22:08:15 留言 :
终于php也有闭包了,哈哈,有意思的补丁,以后服务端代码和客户端代码都混搭了~~
走秀 于 2008-07-23 @ 19:01:46 留言 :
工作环境约束,一直只用4.X
神仙 于 2008-07-24 @ 21:29:59 留言 :
看php的todo,
新的bt功能真是多
暮色今晨 于 2008-07-24 @ 23:15:23 留言 :
希望PHP 越来越好
西风的小孩 于 2008-07-26 @ 15:12:17 留言 :
SO good.
快递网点 于 2008-09-04 @ 14:30:05 留言 :
PHP版本升级太快的点吧。
其实我们需要的是一个稳定的版本还不是版本的高低
skyblue 于 2008-12-30 @ 02:22:23 留言 :
越来越动态化了..
赞.
lxrm 于 2009-01-16 @ 14:41:53 留言 :
爽啊,哈哈,可以像javascript一样写函数了呀,一直觉得这个够强大的哈
auex 于 2009-01-28 @ 20:41:57 留言 :
期待着php6能早点出来
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’);
diyism 于 2009-05-15 @ 13:23:57 留言 :
到这里留言支持 添加闭包功能 吧:
http://bugs.php.net/bug.php?id=47515
Volcano 于 2009-05-15 @ 14:28:49 留言 :
你一定是个深度的js程序员,很多php程序员不适应这种写法。
不过还是支持