[字号:  ]

PHP的lambda函数

发布时间:2008-9-22 15:20   作者: laruence   信息来源: PHPChina 开源社区门户
· 作者:laruence(http://www.laruence.com/)
· 本文地址: http://www.laruence.com/2008/09/20/523.html
· 转载请注明出处

 PHP5.3开始支持Lambda风格的函数,如果大家对Js很熟悉的话, 对于这种风格的函数那就并不陌生了:
   var func = function(para){
        alert(para);
   };
  Lambda风格的函数,最初是(应该是,我猜测)由Lisp系语言中的匿名函数而来的, 在Scheme(Lisp系语言)中,定义一个匿名函数可以使用lambda关键字:
  (define add1 (lambda(x)(+ x 1)));
  在PHP中有很多可以使用回调函数的函数,比如array_map,array_walk, 我一直很郁闷的就是, 对于这样的函数,我必须要先定义个回叫函数,然后将回叫函数的字符串函数名作为参数传递,对于我这样的一个追求代码漂亮的人来说,我对这种方式简直可以说是深恶痛绝。
  所以,在以前,我一直都是使用create_function来创建匿名函数, 可是用create_function的时候,函数体,参数都必须以字符串的方式传入,这样语法高亮就不能被应用,导致代码还是很ugly。
  
  今天,我终于等到了PHP的Lamdba...
  
  首先,让我们先用一个例子,来试试:
<?php
$lambda_fuc = function($string){
    print $string;
};
$lambda_fuc("laruence");
?>
  在PHP5.3的特性介绍中,也说明了,对于一个包含lambda函数的变量来说,可以有3种调用方式:
$lambda ();
call_user_func ($lambda);
call_user_func_array ($lambda, array ());
 
  另外,对于匿名函数来说,最重要的伴随物就应该是闭包了(closure), PHP5.3中也同样支持了闭包,这样,我们就可以使用这个特性,来创建一些流程相同,但是数据并不完全的函数族,举个简单的例子:
<?php
 function closure($var){
     return function($string) use ($var){
         print $string . "\n" . $var;
     };
 }

$func = closure("laruence");
$func("I am");
?>
  当我们var_dump lambda函数的时候,会得到如下结果:
object(Closure)#1 (0) {
  //process
}
 在PHP5.3的特性介绍中,介绍了Lambda的实现具体机理:
 在PHP的语法分析阶段,当遇到lambda函数申明的时候,会调用一个新加入的函数 zend_do_begin_lambda_function_declaration, 这个函数内部会以"lambda"作为参数来调用zend_do_begin_function_declaration,紧接着会以新加入的ZEND_DECLARE_LAMBDA_FUNCTION Opcode来替换生成的ZEND_DECLARE_FUNCTION,
 在编译阶段,ZEND_DECLARE_LAMBDA_FUNCTION会创建一个Closure对象,然后将lambda函数的op_array保存,并使zend_call_fun和zend_is_callable_ex可以调用Closure对象。
 

最新回复

londit.cn at 2008-9-22 17:03:28
受教.顶一个.
lbj007 at 2008-9-24 02:50:05
顶一个,虽然还没想好怎样方便的应用到代码中去。。。
programmerhuang at 2008-9-24 06:49:13

如果只是简单的函数创建, 那没有什么特别的, PHP已经有一个函数创建函数了.
重要的是支持闭包
PHP的闭包要用use引入变量吗?

好像WIKI中, 还有函数对象, 不知道, 5.3有没有支持, 有空下一个测试版试试.
但现在只是测试版, 没准正式版就给去掉了, 就像发布PHP5时, pre1之前都还有命名空间, 后来就给去掉了
laruence at 2008-9-24 09:49:31
对于使用create_function
我也分析过了这样做的不好处

当然,闭包对于匿名函数的重要性那是不言而喻的

恩,所以说,还是耐心的等待PHP6吧,呵呵
slawdan at 2008-9-24 17:08:31

QUOTE:

原帖由 laruence 于 2008-9-24 09:49 发表
对于使用create_function
我也分析过了这样做的不好处

当然,闭包对于匿名函数的重要性那是不言而喻的

恩,所以说,还是耐心的等待PHP6吧,呵呵
有闭包了呀,不错~
不过对php的发展方向产生了疑惑:完整的oo支持是重型语言的方向,闭包和匿名函数是轻量级脚本的特色……
php到底要干什么~
blankyao at 2008-9-25 10:32:45
UCenter的代码中好像用到了
python中也有lambda,用着挺舒服的,呵呵